home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / ms_dos / ct / ct_all next >
Text File  |  1993-11-30  |  165KB  |  5,446 lines

  1. # DIVIDE_START=update.doc
  2.  -------------------------- ct005u --------------------------
  3.  1993.10.4
  4.  ・フリコレ7 修正版
  5.  
  6.  -------------------------- ct005t --------------------------
  7.  1993.10.2
  8.  ・NIFTYの新しいMAILの形式に対応で、日付処理の修正を忘れていた。
  9.  
  10.  -------------------------- ct005s --------------------------
  11.  1993.10.1
  12.  ・NIFTYの新しいMAILの形式に対応。
  13.  ・HPの設置者IDとMAIL発信人IDが同じだとツリーがうまく作れない
  14.   バグ修正。
  15.  ・起動時、引数を表示していたが、テスト終了につき削除。
  16.  
  17.  -------------------------- ct005r --------------------------
  18.  1993.9.15
  19.  ・新オプション追加。
  20.   「-w」の次の引数はTMPディレクトリを指す。
  21.   他のオプションとの優先順位は、
  22.    1.「-w」   TMPディレクトリ
  23.    2.「-o」   出力ディレクトリ
  24.    3.「その他」
  25.   ということで、次のように使います。
  26.  >ct -ow TmpDir OutDir InputDir
  27.   あるいは次のように使っても良いです。
  28.  >ct -o OutDir -w TmpDir InputDir
  29.  
  30.  ・CTDの処理の変更により、「-e」と「-E」のオプションが不用になる。
  31.   削除。
  32.  
  33.  -------------------------- ct005q --------------------------
  34.  1993.9.11
  35.  ・リアルメモリーの確保の際、標準関数の為に残しておく容量を設定するように変
  36.  更した。
  37.   現在、設定値は 8L キロバイトである。
  38.  ・「-z」オプションを指定すると vmap を起動するようにした。
  39.  
  40.  -------------------------- ct005p --------------------------
  41.  1993.9.7
  42.  ・マトコメ・ファイルの作り方の変更。
  43.   フォーラムの会議室とPATIO以外は指定発言以降の全発言をファイルに書き
  44.  出すようにする。
  45.  
  46.  -------------------------- ct005o --------------------------
  47.  1993.9.5
  48.  ・非公開オプション「-e」と「-E」の追加。
  49.   使い方:
  50.     ct -e DirName
  51.          「DirName」にあるファイルを検索して発言を見つけTMPファイルを作る。
  52.          TMPファイルを作って終了する。
  53.     ct [options] -E
  54.          TMPファイルを検索してツリー・ファイルを作る。
  55.          TMPファイルは検索後削除する。
  56.   この2つのオプションはペアで使うこと。
  57.  
  58.  -------------------------- ct005n --------------------------
  59.  1993.9.1
  60.  ・非公開オプション「-l」(小文字のL)追加。
  61.   「comtree0.tmp」の行数を次の引数に指定すると「comtree.tmp」を読んで
  62.  「comtxt.tmp」を作る。
  63.   使い方:
  64.     ct -o f:\tmp -l 97
  65.       こうすると、「f:\tmp」にある「comtree.tmp」を読み込み、
  66.      「f:\tmp」に「comtxt.tmp」を作る。
  67.       FAPXは、「comtxt.tmp」をメモ画面に読み込むのみ。
  68.   〔注意1〕上の使い方以外は不可。引数の順番を守ること。
  69.   〔注意2〕あらかじめ「comtree.tmp」を作っておくこと。
  70.   〔問題点1〕:「会議室.tmp」「DL.tmp」が削除される。
  71.          解決の方法が見つからない。
  72.   〔問題点2〕:デバッグが不充分。
  73.   将来的には別プログラムとする予定。(プログラムサイズを小さくする為)
  74.  
  75.  -------------------------- ct005m --------------------------
  76.  1993.8.31
  77.  ・「comtree.tmp」の内容の変更。
  78.   1.2行目の末にコメントレベルの値を追加。
  79.         >"%5d %5d %8ld %8ld %5d %5d %10s %2d\n"
  80.           | | |  | | | | ↓
  81.           | | |  | | | ↓ コメントレベル ← 追加(☆)
  82.           | | |  | | ↓ 発言日時
  83.           | | |  | ↓ 発言の終了行
  84.           | | |  ↓ 発言の開始行
  85.           | | ↓  発言の終了バイト数
  86.           | ↓ 発言の開始バイト数
  87.           ↓ コメント元番号
  88.           発言番号
  89.     ただし、
  90.      「フォーラム名変更」の場合は -2
  91.      「会議室名変更」の場合は     -1
  92.    とする。
  93.     DLの場合、会議室の発言があった場合は -1 となり、会議室の発言が無か
  94.    った場合は -2 となる。
  95.  
  96.   2.フォーラムの会議室以外の「フォーラム名変更」の題名の付け方を変える。
  97.     例:HP:GHH01217 のHPです
  98.       PATIO:GHH01217 のPATIOです
  99.       MAIL:GHH01217 のMAILです
  100.  
  101.   3.「フォーラム名変更」「会議室名変更」の1行目の形式を変更。
  102.     「CHANGE:FORUM フォーラム名変更」
  103.     「CHANGE:MES 会議室名変更」
  104.    とする。
  105.  
  106.   4.「フォーラム名変更」「会議室名変更」の2行目の形式を変更。
  107.     発言の2行目と同じ形式にする。
  108.      「    0     0        0        0     0     0          0 -2」
  109.      「    0     0        0        0     0     0          0 -1」
  110.     変更するフォーラム名等は3行目に移動。
  111.  
  112.  -------------------------- ct005L --------------------------
  113.  1993.8.30
  114.  ・まだリアルメモリー不足で起動できないという。
  115.   ヒープ領域の確保量を減らす。
  116.    ファイル入力用バッファ領域 20kバイト
  117.    オンメモリー処理(IDX2)用 64kバイト
  118.    オンメモリー処理(IDXS)用 42kバイト
  119.  
  120.  -------------------------- ct005k --------------------------
  121.  1993.8.30
  122.  ・MopTerm上から実行すると、リアルメモリー不足が発生する。
  123.   ヒープ領域の確保量を減らす。
  124.    ファイル入力用バッファ領域 31kバイト
  125.    オンメモリー処理(IDX2)用 64kバイト
  126.    オンメモリー処理(IDXS)用 48kバイト
  127.  
  128.  ・「comtree.tmp」の1行目が「FORUM:xxxx MES:dd」となっているはずなのに
  129.   「FORUM:xxxx MESdd」となっていた。修正。
  130.  
  131.  -------------------------- ct005j --------------------------
  132.  1993.8.29
  133.  ・「comtxt.tmp」を作ることの高速化。
  134.  
  135.  1993.8.28
  136.  ・1つの会議室での発言数が5040個より大きい場合の処理の追加。
  137.  
  138.  ・オンメモリーでの処理完了。
  139.   0.05i からの差分を作る。
  140.  
  141.  1993.8.27
  142.  ・発言の数が少ない時はオンメモリーで処理する部分を追加。
  143.   idx2 idxs
  144.   
  145.  -------------------------- ct005i --------------------------
  146.  1993.8.26
  147.  ・0.05h のバグ修正。
  148.  
  149.  -------------------------- ct005h --------------------------
  150.  1993.8.26
  151.  ・せっかくDLにアップしたが、バグがあり、削除依頼を出した。
  152.  
  153.  1993.8.26
  154.  ・DLにアップ。FTOWNS1-DL2
  155.  
  156.  -------------------------- ct005g --------------------------
  157.  1993.8.25
  158.  ・DLのバグ修正。
  159.  
  160.  -------------------------- ct005f --------------------------
  161.  1993.8.25
  162.  ・DLのバグ修正。
  163.  
  164.  -------------------------- ct005e --------------------------
  165.  ・DLのバグ修正。
  166.  
  167.  -------------------------- ct005d --------------------------
  168.  1993.8.23
  169.  ・課金情報に対応。
  170.  
  171.  -------------------------- ct005c --------------------------
  172.  1993.8.23
  173.  ・「今週のお知らせ」の不具合の修正。
  174.  ・クリッピングサービス対応。
  175.  
  176.  -------------------------- ct005b --------------------------
  177.  1993.8.22
  178.  ・「今週のお知らせ」に対応。
  179.  
  180.  -------------------------- ct005a --------------------------
  181.  1993.8.20
  182.  ・DLに対応。
  183.  ・発言番号は unsigned int で処理することにする。順次変更。
  184.  ・ファイルのサイズが0の場合、読み込めないという不具合の修正。
  185.  ・データライブラリー(DL)一覧用のファイルを作るようにした。
  186.   ファイル名「DL.TMP」
  187.  ・コメント元発言が別のファイル等で見つからなかった場合、処理されない発言が
  188.   発生していた。バグ修正。
  189.  ・while ( kbhit() ) getch(); を Check1File と Sort1Kaigi に潜ませるように
  190.   変更。会議室毎に終了判定を行うようにしたので反応が良くなる。
  191.  ・同じフォーラムの同じ会議室で複数の日付の発言がある場合で、コメント元番号
  192.   が1番の時、うまくツリーが作れないバグ修正。
  193.  ・同じフォーラムの同じ会議室で、発言番号がより小さくなった時、会議室名を表
  194.   示するようにした。(「comtree0.tmp」にも書き出される)
  195.  
  196.  -------------------------- ct004q --------------------------
  197.  1993.8.19
  198.  ・同一フォーラム、同一会議室のコメントツリーの作成にバグあり。修正。
  199.   このバグは ct004p で入れたもの。
  200.  
  201.  -------------------------- ct004p --------------------------
  202.  1993.8.18
  203.  ・1つの会議室で処理できる発言の数を増やす工夫。
  204.   (1) 発言番号・コメント元番号を long で扱っているが、unsigned int にする。
  205.   (2) コメントツリーのレベルが深すぎる場合の処理を変更する。
  206.  
  207.  -------------------------- ct004o --------------------------
  208.  1993.8.15
  209.  ・今度こそフリコレ7応募版に。
  210.  ・発言番号、コメント元番号を long で処理する。
  211.  
  212.  -------------------------- ct004n --------------------------
  213.  1993.8.15
  214.  ・フリコレ7応募版にしたかったのだが………。
  215.  ・HPの発言の切り出しに不具合あり。修正。
  216.  
  217.  -------------------------- ct004m --------------------------
  218.  1993.8.13
  219.  ・@ファイルに対応。
  220.     使い方:ct @FileName
  221.     ファイルの内容は、コマンドラインの書式と同じ。
  222.    ファイルの中身に「@FileName」を入れても良い。しかし、スタック領域不足
  223.   でハングするかも知れない。
  224.    また、
  225.         ct -o @deffile
  226.   として、deffile の中身の第1番目の数に出力ディレクトリの指定をする、とい
  227.  うような使い方はできない。上の用法だと @deffile というディレクトリに処理の
  228.  結果を書き出そうとする。(当然エラーとなるだろう)
  229.  
  230.  ・オプションスイッチの考え方を変更。
  231.   「-」が頭に無い引数は、入力ファイル名、または入力ディレクトリ名である。
  232.     使い方:ct InputDir
  233.         ct InputFileName
  234.         ct InputDir1 InputDir2
  235.     名前にはワイルドカードが使える。
  236.  
  237.   「-o」の次の引数は、出力ディレクトリとする。
  238.     使い方:ct -o OutDir
  239.    「-o」引数は、入力するファイルの指定よりも先に行うこと。そうでないと
  240.   「会議室.tmp」が指定のディレクトリではなく、カレント・ディレクトリに作
  241.   成されてしまう。
  242.   例: 途中経過の表示無し
  243.      「comtxt.tmp」の出力無し
  244.      入力「f:\log」
  245.      出力「g:\tmp」
  246.    の場合の指定の仕方:(下の指定はいずれも同じ結果を生じる)
  247.         ct -DoT g:\tmp f:\log
  248.         ct -DTo g:\tmp f:\log
  249.         ct -DT -o g:\tmp f:\log
  250.         ct -D -To g:\tmp f:\log
  251.         ct -D -T -o g:\tmp f:\log
  252.         ct -DT f:\log -o g:\tmp 
  253.    なお、次のようにすると、処理中の発言を表示するがツリーは画面に表示しない
  254.         ct f:\log -DTo g:\tmp
  255.   この件に対応の為、引数の処理の部分を修正。
  256.  
  257.  ・会議室名の取得部分の修正。
  258.  
  259.  1993.8.12
  260.  ・検索するファイルの1行目に「ID (改行のみ:自分のHP)」があると、きちんと
  261.  HP名が入力できないバグの修正。
  262.  
  263.  -------------------------- ct004L --------------------------
  264.  1993.8.12
  265.  1.「[ESC]で中断」を入れる。
  266.  
  267.  1993.8.11
  268.  1.CATLOG整理済ファイルの検索時、カレント・ファイル(とCATL
  269.   OGの方では言っています---勝手に)だけを検索するオプションの設定。
  270.   オプション名「A」----カレント・ファイルのみ検索する。
  271.   オプション名「a」----全てのファイルを検索する(デフォルト値)。
  272.  2.ファイルを指定してツリーを作る際、ファイルサイズの指定に不具合があ
  273.   り、指定のファイルを読み込まない場合が発生する不具合の修正。
  274.  
  275.  -------------------------- ct004k --------------------------
  276.  1993.8.11
  277.  ・オプションスイッチ名の変更。
  278.     -D ・・・・・・・   標題等を画面上に表示しない
  279.     -d ・・・・・・・ * 標題等を画面上に表示する
  280.     -F数 ・・・・・   数Kバイトまでファイルを検索する
  281.     -f ・・・・・・・ * サイズで中断しない
  282.     -R ・・・・・・・   サブディレクトリのファイルを検索しない
  283.     -r ・・・・・・・ * サブディレクトリのファイルを検索する
  284.     -T ・・・・・・・   発言の本体を出力しない
  285.     -t ・・・・・・・ * 発言の本体を出力する
  286.  
  287.     -1 ・・・・・・・   ベタのまま、発言の標題を表示する
  288.     -2 ・・・・・・・ * コメントツリーで発言の標題を表示する
  289.  
  290.                * は、デフォルトの設定です
  291.  
  292.  1.MS-DOS の環境変数 tmp を参照して、内部のTMPファイルはそこに作る。
  293.    なければ OutDir に作る。
  294.  2.MS-DOS の環境変数 ctusr を参照して、
  295.    (1) ディレクトリを再帰的に検索しない指定
  296.    (2) 読み込むログのサイズを制限する
  297.    なければ、今まで通り。
  298.  3.while ( kbhit() ) getch(); を Check1File と SortMainONFileSub に潜ませる。
  299.  
  300. -------------------------- ct004j --------------------------
  301. 1993.8.10
  302. ・「comtree.tmp」に書き出す行数を2行にする。
  303.     1行目:発言に関するデータ
  304.                 フォーラム名等が変わった場合は「フォーラム名変更」が入る
  305.                 会議室番号が変わった場合は  「会議室名変更」が入る
  306.     2行目:ファイル名
  307.                 「フォーラム名変更」「会議室名変更」の場合、それぞれの
  308.                 名前が入る。
  309.  
  310. -------------------------- ct004i --------------------------
  311. 1993.8.10
  312. ・CATLOGで整理したファイルの内、HP、PATIO、MAILの場合、
  313. フォーラム名変更の出力がうまく行っていなかった。修正。
  314. ・「comtree.tmp」に書き出す行数を3行にする。
  315.     1行目:フォーラム名の行
  316.                 フォーラム名等が変わった場合は「フォーラム名変更」が入る
  317.                 会議室番号が変わった場合は  「会議室名変更」が入る
  318.     2行目:発言に関するデータ
  319.                 「フォーラム名変更」「会議室名変更」の場合、それぞれの
  320.                 名前が入る。
  321.     3行目:ファイル名
  322.                 「フォーラム名変更」「会議室名変更」の場合、改行のみ。
  323.  
  324. -------------------------- ct004h --------------------------
  325. 1993.8.9
  326. ・「comtree.tmp」に書き出す行数を4行にする。
  327.     1行目:フォーラム名 会議室番号 */
  328.                 フォーラム名等が変わった場合は「フォーラム名変更」が入る
  329.                 会議室番号が変わった場合は  「会議室名変更」が入る
  330.     2行目:フォーラム名の行
  331.                 「フォーラム名変更」「会議室名変更」の場合、それぞれの
  332.                 名前が入る。
  333.     3行目:発言に関するデータ
  334.     4行目:ファイル名
  335.  
  336. -------------------------- ct004g --------------------------
  337. 1993.8.9
  338. ・内部のTMPファイルの中身の変更。
  339.     1行目:フォーラム名と会議室番号を書き出す
  340.     2行目:ForumNameLine を書き出す
  341.     3行目:会議室名の行を書き出す
  342.     4行目:ファイル名を書き出す
  343.     5行目:発言に関するデータを書き出す
  344.     6行目:発言の題名
  345.  
  346. >1993.6.28
  347. >・「comtree.tmp」ファイルには発言の標題のみを書き込むことにする。
  348. > いつでも復旧できるように #ifndef ONLY_HYOUDAI として書き込む部分を削除す
  349. >る。
  350.  を削除。
  351.  
  352. ・main.c が大きくなって来たので check.c と sort.c の2つの分割。
  353.  
  354. ・発言の終了判定に以下の2つの文字列を追加した
  355.     "ID (改行のみ:自分のHP)"
  356.     "ID (改行のみ:自分のパティオ)"
  357.  
  358. -------------------------- ct004f --------------------------
  359. 1993.8.8
  360. ・CATLOGの出力ディレクトリに対して実行した場合、会議室名が全部同じにな
  361. ってしまうバグの修正。
  362. ・「フォーラム名変更」の場合「comtree.tmp」にフォーラム名の行が書き出されて
  363. いない。
  364. ・「会議室変更」を「会議室名変更」に変更。
  365.  
  366. -------------------------- ct004e --------------------------
  367. 1993.8.8
  368. ・makeIndex でメールの処理にバグがあった。修正。
  369.  
  370. -------------------------- ct004d --------------------------
  371. 1993.8.7
  372. ・「fapxtree.tmp」を作らないモードを作った。(標準で作らないということ)
  373.  ct.h に MAKE_FAPXTREE_TMP を設定してある。それを #undef すると、作らないモ
  374. ードになる。
  375.  また、このバージョンは、VERIFY == NO で作った。どれぐらい速くなるのかを調
  376. べるためである。
  377.  
  378. -------------------------- ct004c --------------------------
  379. 1993.8.6
  380. ・PATIOの処理で発言日時の処理にバグがあった。修正。
  381.  
  382. -------------------------- ct004b --------------------------
  383. 1993.8.4
  384. ・検索する発言にMAILを追加。
  385.  
  386. ・発言を見つけた時の、発言に関するデータを書き出すファイル名を変更。
  387.     ALL_MAIL    "$A0"            /* 1つにまとめた MAIL ファイルである */
  388.     BILL        "$B0"            /* 利用料金情報である */
  389.     CLIP        "$C0"            /* クリッピングサービスである */
  390.     MES            "$Fx"            /* フォーラムの会議室である */
  391.     HP            "$H0"            /* Home Party である */
  392.     COLLECT_ID    "$I0"            /* ID収集ファイルである */
  393.     LIB            "$L0"            /* LIB の一覧である */
  394.     COLLECT_LIB    "$L1"            /* IDによる LIB の収集ファイルである */
  395.     MAIL        "$M0"            /* 電子メールである */
  396.     PATIO        "$P0"            /* PATIO である */
  397.  
  398. -------------------------- ct004a --------------------------
  399. 1993.8.3
  400. ・PATIO関連の不具合を修正。
  401.  
  402. 1993.8.2
  403. ・仕様の変更
  404.  1.オプション・スイッチの内、会議室指定、HP指定、PATIO指定を削除。
  405.  2.1ファイル指定、複数ファイル指定を削除。
  406.  3.入力ディレクトリは必ず指定するように変更。
  407.    カレント・ディレクトリの場合は「.」を使用すること。
  408.    指定の入力ディレクトリがディレクトリであれば、そのディレクトリの下の全
  409.   ファイルを検索して発言を見つけるように変更。
  410.  4.CATLOGで整理してできたファイルを検索するのか、生のログ・ファイル
  411.   を検索するのかの指定も、無効とする。
  412.  
  413. -------------------------- ct003p --------------------------
  414. 1993.7.26
  415. ・発言の標題の処理がうまくいっていなかった。修正。
  416. ・「comtree.tmp」と「comtree0.tmp」の処理が一部うまくいっていなかった。修正。
  417.  
  418. -------------------------- ct003o --------------------------
  419. 1993.7.25
  420. >  1.ファイルの指定をサポートする。
  421. >  2.処理中である事を動きの有る方法でユーザーに伝える。
  422.  
  423. -------------------------- ct003n --------------------------
  424. 1993.7.24
  425. ・コメントツリーの表示を下のJIS罫線を使って行うように変更。
  426. >>;  初期値(機種依存なし)  :+-+-| +-
  427. >>;  FM-R系で新JIS機種   :┣┗┃╋
  428.  
  429. -------------------------- ct003m --------------------------
  430. 1993.7.24
  431. ・発言の検索の不具合の修正。
  432.  問題点:PATIOを指定しているのにフォーラムの発言を検索してしまう。
  433.  これは、フォーラムの会議室とPATIOの、それぞれの発言番号の行の形式が同
  434. じなため、誤動作するものである。
  435.  そこで、「StartMesSw」というスイッチを設け、フォーラムの入口と認識した場合
  436. のみ、ONにし、HP、PATIOの入口の場合はOFFとするようにした。
  437.  
  438. ・「comtree.tmp」「comtree0.tmp」「fapxtree.ymp」に書き出す標題の行を標題の
  439. 部分だけにした。
  440.  
  441. ・「comtree.tmp」「comtree0.tmp」「fapxtree.ymp」の行の統一を図った。
  442.  「comtree0.tmp」と「fapxtree.ymp」が同じ行数だけあるようにした。
  443.  「comtree0.tmp」の行数の8倍の所に「comtree.tmp」があるようにした。
  444.  なお、「fapxtree.ymp」には、「」の1行を追加するようにした。
  445.  また、「comtree.tmp」には、「フォーラム名変更」あるいは「会議室変更」の
  446. 1行と、それぞれフォーラム名の行、会議室名の行を追加し、さらに6行の空行を
  447. 追加するようにした。
  448.  
  449. ・検索するファイルの指定の不具合を修正。
  450.  かなり混みいった問題である。ソースの Check1File の部分を見ること。
  451.  
  452. -------------------------- ct003l --------------------------
  453. 1993.7.23
  454. ・操作性の統一を図った。
  455.  1.新しいオプションの追加。
  456.    「-m」フォーラムの会議室の発言を検索する
  457.  2.オプションスイッチ名の変更。
  458.    「-n」→「-c」………CATLOGで整理したファイルを使用する
  459.    「-2」→「-a」………全ての会議室、HP、PATIOの発言を検索する。
  460.  3.これらのオプションが設定されていない場合は、発言を検索できない。
  461.  
  462. ・ドキュメントの作成。
  463.   readme.doc と ct.ggg
  464.  
  465. -------------------------- ct003k --------------------------
  466. 1993.7.22
  467. ・「fapxtree.tmp」の「date=xxxx」の後ろに「;」を付けるのを忘れていた。修正。
  468.  
  469. ・「fapxtree.tmp」の「title=」の後ろには、NIFTYの発言番号の行をそのまま
  470. 書き出すようにした。
  471.  
  472. ・実行開始時に、TmpDirの「*.$*」ファイルを削除するようにした。
  473.  
  474. ・「comtxt.tmp」の各発言の行頭に次の行を入れるようにした。
  475.   HPの場合    *****log整理(HP:xxxxxxxx          ) ファイル名 *****
  476.   PATIOの場合 *****log整理(PATIO:xxxxxxxx       ) ファイル名 *****
  477.   フォーラムの場合 *****log整理(FORUM:xxxxxxxx MES:xx) ファイル名 *****
  478.  「xxxxxxxx」の部分は8文字で、左詰めで表示する。
  479.  「xx」の部分は2文字で、右詰めで表示する。
  480.  
  481. ・内部形式の変更(comtree.tmp)
  482.  関係のある関数は sort1_sub2() makeIndex()。
  483.     1行目はフォーラム名。HP、PATIOの場合は設置者ID。
  484.     2行目はフォーラム名の行(NIFTYの形式)
  485.     3行目は会議室名の行
  486.     4行目は
  487.         >"%5d %5d %8ld %8ld %5d %5d %10ld\n"
  488.           | | |  | | | ↓
  489.           | | |  | | ↓ 発言日時
  490.           | | |  | ↓ 発言の終了行
  491.           | | |  ↓ 発言の開始行
  492.           | | ↓  発言の終了バイト数
  493.           | ↓ 発言の開始バイト数
  494.           ↓ コメント元番号
  495.           発言番号
  496.     5行目は発言のあったファイル名をパス名付きで書き出す。
  497.     6行目は標題の行を書き出す。(ツリー形式)
  498.     7行目は標題の行を書き出す。(発言番号の行。NIFTYの形式)
  499.     8行目は改行コードだけが入る。
  500.  
  501. ・version 0.03h より作り直す。
  502.  
  503. -------------------------- ct003j --------------------------
  504. 1993.7.19
  505. ・st を size_t 型に変更。
  506. ・発言の標題をオンメモリで処理するようにした。
  507. ・メモリモデルをヒュージ型とした。
  508.  
  509. 1993.7.19
  510. ・発言番号を long として処理するようにしたバージョン
  511.  
  512. -------------------------- ct003i --------------------------
  513. 1993.7.19
  514. ・発言番号を int として処理するようにしたバージョン
  515.  
  516. -------------------------- ct003h --------------------------
  517. 1993.7.18
  518. ・衆議院議員選挙の日。(関係ない)
  519.  
  520. ・テスト用スイッチを追加。
  521.  「-u」「u」に続けて数字を書くと、そのレベルまでのツリーとする。
  522.  
  523. ・FAPXのためのデータを出力する。ファイル名は「FAPXTREE.TMP」。
  524.  フォーラム名の場合:forum=<FROUM名>;
  525.            mes=<会議室番号>;
  526.  HPの場合    :hp=<ID>;
  527.  PATIOの場合 :patio=<ID>;
  528.  発言番号     :no=<発言番号>;
  529.  コメント元番号  :com=<コメント元番号>;
  530.  開始位置     :sb=<数>;        ← バイト単位
  531.            sl=<数>;        ← 行単位
  532.  発言のサイズ   :eb=<数>;        ← バイト単位
  533.            el=<数>;        ← 行単位
  534.  発言日時     :date=<数>;
  535.  ファイル名    :file=<パス付きファイル名>;
  536.  標題       :title=<文字列>
  537.  
  538. ・内部形式の変更
  539.  関係のある関数は sort1_sub2() makeIndex()。
  540.     1行目はフォーラム名。HP、PATIOの場合は設置者ID。
  541.     2行目はフォーラム名の行(NIFTYの形式)
  542.     3行目は会議室名の行
  543.     4行目は
  544.         >"%5d %5d %8ld %8ld %5d %5d %10ld\n"
  545.           | | |  | | | ↓
  546.           | | |  | | ↓ 発言日時
  547.           | | |  | ↓ 発言の終了行
  548.           | | |  ↓ 発言の開始行
  549.           | | ↓  発言の終了バイト数
  550.           | ↓ 発言の開始バイト数
  551.           ↓ コメント元番号
  552.           発言番号
  553.     5行目は発言のあったファイル名をパス名付きで書き出す。
  554.     6行目は標題の行を書き出す。
  555.     7行目は改行コードだけが入る。
  556.  
  557. 1993.7.15
  558. ・「i」[インデックスからツリーを作る]を削除
  559. ・ツリー作成の際の不具合を修正。
  560. ・複数のCATLOG整理済の発言についてもツリーを作るようにした。
  561.  
  562. -------------------------- ct003g --------------------------
  563. 1993.7.15
  564. ・「-2」の時、同時に「-l」スイッチも設定してある場合はファイル名として処理す
  565. るように修正。
  566.  
  567. ・「comtree.txt」の出力形式を変更。
  568.  HP、PATIOの場合もフォーラムと同じ順にした。
  569.  
  570. 1993.7.14
  571. ・「-2」mode における出力形式の変更。
  572.  TmpDirに下のファイルを作る。
  573.  フォーラムの会議室の発言:フォーラム名+$M数 数:1~9とA~K
  574.  HP       の発言:設置者ID +$H0
  575.  PATIO    の発言:設置者ID +$P0
  576.  TmpDirが設定されていない場合はカレントディレクトリに作られる。
  577.  
  578. 1993.7.13
  579. ・新しいオプションの追加。
  580.  「-t」発言の本体を出力しないという指定。
  581.  
  582. 1993.7.12
  583. ・sort1() を書き換える。この書換えによって調べる階層の深さをより深く出来るよ
  584. うになった。
  585.  コメントの深さ LEVEL_COMMENT を 35 で定義。
  586. ・新しいオプションの追加。
  587.  「-d」画面上に表示していた標題等の行を表示しないようにするスイッチ。
  588.  実行環境にもよると思うが、約36%時間が短縮される。
  589.  
  590. -------------------------- ct003f --------------------------
  591. 1993.7.11
  592. ・0.03e の修正では無視された発言が表示されない。勿論、処理されない。
  593.  バグ修正。
  594.  
  595. -------------------------- ct003e --------------------------
  596. 1997.7.11
  597. ・コメント関係が深いと「stack overflow」エラーで中断してしまうバグ報告。
  598. ←Yama-chanより。
  599.  コメントの深さを LEVEL_COMMENT で定義。とりあえず 20 に設定してある。
  600.  これ以上深いレベルの関係は無視する。
  601.  
  602. -------------------------- ct003d --------------------------
  603. 1993.7.11
  604. ・comtree0.tmp という標題だけのファイルを作ることにした。
  605.  
  606. -------------------------- ct003c --------------------------
  607. 1993.7.10
  608. ・新しいオプションの追加。
  609.  「-2」:全てのフォーラム、HP、PATIOについて検索する。
  610. ・comtree.tmp は6行を基本とするように変更した。
  611.     1行目はフォーラム名の行
  612.     2行目は会議室名の行
  613.     3行目は
  614.         >"%5d %5d %8ld %8ld %5d %5d %10ld\n"
  615.           | | |  | | | ↓
  616.           | | |  | | ↓ 発言日時
  617.           | | |  | ↓ 発言の終了行
  618.           | | |  ↓ 発言の開始行
  619.           | | ↓  発言の終了バイト数
  620.           | ↓ 発言の開始バイト数
  621.           ↓ コメント元番号
  622.           発言番号
  623.     4行目は発言のあったファイル名をパス名付きで書き出す。
  624.     5行目は標題の行を書き出す。
  625.     6行目は改行コードだけが入る。
  626.  
  627. -------------------------- ct003b --------------------------
  628. 1993.7.4
  629. ・フォーラムの会議室の発言が整理できないバグ報告<Yama-chanさん
  630. ・オプションスイッチ「-v」の導入。但し、未公開バージョンのみ。
  631.  
  632. -------------------------- ct003a --------------------------
  633. 1993.7.4
  634.  発言の日時でソートを行っていないバグの報告。<Yama-chanさん
  635.  内部形式の行に追加。以下のようになる。
  636. >"%5d %5d %8ld %8ld %5d %5d %10ld\n"
  637.   | | |  | | | ↓
  638.   | | |  | | ↓ 発言日時
  639.   | | |  | ↓ 発言の終了行
  640.   | | |  ↓ 発言の開始行
  641.   | | ↓  発言の終了バイト数
  642.   | ↓ 発言の開始バイト数
  643.   ↓ コメント元番号
  644.   発言番号
  645.  
  646. -------------------------- ct002e --------------------------
  647. 1993.6.28
  648. ・「comtree.tmp」ファイルには発言の標題のみを書き込むことにする。
  649.  いつでも復旧できるように #ifndef ONLY_HYOUDAI として書き込む部分を削除する。
  650. ・HPとPATIOに対応。ただし、チェックが不充分。
  651.  実行形式
  652.     ct -hi ID CATLOGディレクトリ名 TMPディレクトリ名
  653.     ct -hn ID CATLOGディレクトリ名 TMPディレクトリ名
  654.     ct -hf ID ログ・ファイルディレクトリ名 TMPディレクトリ名
  655.  実行形式
  656.     ct -pi ID CATLOGディレクトリ名 TMPディレクトリ名
  657.     ct -pn ID CATLOGディレクトリ名 TMPディレクトリ名
  658.     ct -pf ID ログ・ファイルディレクトリ名 TMPディレクトリ名
  659.  IDは、設置者のIDである。
  660.  PATIOはベタ指定も可。HPはベタ指定しても無視。
  661.  
  662. 1993.6.27
  663. ・「comtree.tmp」の1行目の出力形式を固定長とした。
  664. ・ファイルの先頭からの行数と発言本体の行数を記録するようにした。
  665.  ただし、CATLOGのインデックスからコメントツリーを作った場合は入らない。
  666.  上2点については、次のようになる。
  667. >"%5d %5d %8ld %8ld %5d %5d\n"
  668.   | | |  | | ↓
  669.   | | |  | ↓ 発言の終了行
  670.   | | |  ↓ 発言の開始行
  671.   | | ↓  発言の終了バイト数
  672.   | ↓ 発言の開始バイト数
  673.   ↓ コメント元番号
  674.   発言番号
  675.  
  676.     1行目は
  677.         発言番号、
  678.         コメント元番号、
  679.         ファイル中での位置(seek位置)、
  680.         発言のバイト数(標題の行の文字数も含みます)
  681.         発言の開始行
  682.         発言の終了行
  683.  
  684. -------------------------- ct002d --------------------------
  685. 1993.6.27
  686. ・「-f」や「-l」の場合、最初の発言がその番号よりも前の発言へのコメントであっ
  687. た場合、正しく処理されないバグの修正。
  688.  
  689. ・出力形式の変更。ファイル位置を、ファイル先頭からの行数にする。
  690. >参考)mread(ファイル名[,メモ番号[,開始バイト位置[,読み込みバイト数]]])
  691.  あれ? これだとバイト数がいいんだけどなあ。とういことで、変更はなし。
  692.  
  693. ・発言をファイルに書き出す。書き出すファイルを名は「comtxt.tmp」とする。
  694.  
  695. 1993.6.26
  696. ・新しいオプションの追加。
  697.  「-l」で、InputDir名の所にファイル名を指定する。
  698.  これで、ファイルを指定してコメントツリーを作ることができるようになる。
  699.  
  700. -------------------------- ct002c --------------------------
  701. 1993.6.26
  702. ・-i で、指定のディレクトリに存在しない会議室番号を設定すると異常終了する。
  703.  「CATLOGで整理したファイルが見つかりません」と表示される。
  704. ・指定ディレクトリをカレントディレクトリとして指定するとサブ・ディレクトリの検索を行ってい
  705. ない。「CATLOGで整理したファイルが見つかりません」と表示される。
  706. ・CATLOGのインデックス・ファイルにはあるのに整理したファイルが rename されたかで、
  707. 「MESxx_xx.TXT」の形になっていない場合、その発言は無視することにした。
  708. (以前はエラーで終了)
  709.  
  710. 1993.6.25
  711. ・指定のディレクトリに発言が見つからなかった時の終了処理を強化。
  712.  発言が見つからなかった場合は「comtree.tmp」というファイルは削除する(存在
  713. しないようにする)
  714.  
  715. ・CATLOGのインデックス・モードで「全体で1つ」を指定した場合の処理の強化。
  716.  単に、インデックスのあったディレクトリに「ディレクトリ\FORUM\MESxx_xx.TXT」というファイル
  717. があるかどうかのチェックを行っているだけ。あればそれを発言ファイル名とする。
  718. (超安易モード)
  719.  
  720. -------------------------- ct002b --------------------------
  721. 1993.6.24
  722.  発言のバイト数をファイルに書き出す部分を追加。
  723.  
  724. -------------------------- ct002a --------------------------
  725. 1993.6.23
  726.  処理の高速化を始めた。
  727.  ベタ・タイトル表示の場合、コメント・ツリー表示もすることにした。
  728.  この場合、「allover.tmp」というファイルにベタ・タイトルのデータを書き出し
  729. ている。
  730.  
  731. -------------------------- ct001d --------------------------
  732. 1993.6.22
  733.  各表示の行頭に発言番号を表示することはやめにした。
  734.  
  735. -------------------------- ct001c --------------------------
  736. 1993.6.21
  737.  ベタタイトル表示モードの追加。
  738.  実行形式
  739.     ct -i1 フォーラム名 会議室番号 CATLOGディレクトリ名 TMPディレクトリ名
  740.     ct -n1 フォーラム名 会議室番号 CATLOGディレクトリ名 TMPディレクトリ名
  741.     ct -f1 フォーラム名 会議室番号 ログ・ファイルディレクトリ名 TMPディレクトリ名
  742.  これは、コノミさんの提案による。
  743.  
  744.  発言番号の表示を必ず5桁になるようにした。
  745.  
  746. -------------------------- ct001b --------------------------
  747. 1993.6.21
  748.  発言番号とコメント元番号の桁数を5文字とした。
  749.  
  750.  各行の最初に5桁で発言番号を入れることにした。
  751.  これは、コノミさんの提案による。
  752.  
  753. -------------------------- ct001a --------------------------
  754. 1993.6.21
  755.  Version 0.01a 完成。内部公開。
  756.  
  757. 1993.6.18
  758. ・作成開始。
  759. ・仕様
  760.  実行形式
  761.     ct -i フォーラム名 会議室番号 CATLOGディレクトリ名 TMPディレクトリ名
  762.         この場合、CATLOGのインデックスファイルを参照する。
  763.  
  764.     ct -n フォーラム名 会議室番号 CATLOGディレクトリ名 TMPディレクトリ名
  765.         CATLOGで整理したファイルだけを参照する。
  766.  
  767.     ct -f フォーラム名 会議室番号 ログ・ファイルディレクトリ名 TMPディレクトリ名
  768.         生のログ・ファイルがあるものとして処理を行う。
  769.  
  770.  実行後
  771.     「TMPディレクトリ名」の下に「comtree.tmp」というファイルを作る。
  772.     NIFPが作るようなコメントツリーの順にデータを書き出す。
  773.     そのファイルの内容は、4行が1セットになる。
  774.     1行目は
  775.         発言番号、
  776.         コメント元番号、
  777.         ファイル中での位置(seek位置)、
  778.         発言のバイト数(標題の行の文字数も含みます)
  779.         発言の日時
  780.     を順に書き出す。
  781.     2行目は発言のあったファイル名をパス名付きで書き出す。
  782.     3行目は標題の行を書き出す。
  783.     4行目は改行コードだけが入る。
  784.  
  785.  なお、TMPディレクトリには作業用として「$ct0.tmp」「$ct1.tmp」「$ct2.tmp」
  786. 等のファイルが作られる。
  787.  作業用ファイルは処理が終わると削除される。
  788.  
  789. ・処理の内容
  790.  CATLOGのインデックス・ファイルの構造
  791. >16  64 9306150913  FTOWNS1  64559  62
  792. >16  65 9306151935  FTOWNS1  66412   0
  793. >16  66 9306152121  FTOWNS1  67287  64
  794. >16  67 9306152157  FTOWNS1  68438  62
  795.  ↑ ↑ ↑     ↑   ↑   ↑
  796.  | | |     |   |   コメント元の発言番号(A)
  797.  | | |     |   MESxx_xx.TXTファイルでの発言の開始位置(B)
  798.  | | |     フォーラム名(C)
  799.  | | 発言日時(D)
  800.  | 発言番号(E)
  801.  会議室番号(F)
  802.  
  803.  1.フォーラム名と会議室番号を入力する。(FAPX)
  804.  2.CATLOGのインデックスファイルから会議室番号(F)と発言番号
  805.    (E)と発言の開始位置(B)とコメント元発言番号(A)を抽出する。
  806.    抽出した結果をファイルに書き出す。書き出す内容は、
  807.    (1)抽出元ファイル CATLOGの場合だと、MESxx_xx.TXTのファイル
  808.     (2)上の A ~ F の値
  809.  3.NIFPがやっているような順にデータを並び替える。
  810.  4.並び替えたデータをファイルに書き出す。
  811.  5.4で作ったファイルを順に参照しながら(特にBを参照する)発言番号
  812.    の行を画面に表示していく。あるいは、別のファイルに書き出す。
  813.  6.FAPXは、5のデータを表示してマウスのダブルクリックから、指定
  814.    の行--先頭から何行目か---を上のリアルプログラムに渡す。
  815.  7.リアルプログラムでは、指定された行数と、4のファイルを参照して、
  816.    指定発言を別のファイルに切り出す。
  817.  8.再びFAPXは、そのファイルをメモ画面に表示してRESを書く。
  818.  
  819.  普通のログファイルからもコメントツリーを作れるようにする。
  820.  
  821.  
  822.  以下の人々が、このプログラムの作成に協力してくれました。
  823.  ここに紹介して感謝の念を表したいと思います。
  824.                       PEE01244  Yama-chan    さん
  825.                       PFG02442  <Nakatani> さん
  826.            QFH02666 『コノミ』 さん
  827. # DIVIDE_END
  828.  
  829. /* DIVIDE_START=check.c */
  830. /*
  831.     コメントツリー作成プログラム                                check.c
  832.  
  833.             作 : 山先(NIFTY-ID:GHH01217)
  834. */
  835.  
  836. #include    "ct.h"
  837.  
  838. static    int        isCATLOGFile( const char *f_name )
  839. {
  840.     int        num;
  841.     char    *p1 , *p2;
  842.     FILE    *fpi;
  843.  
  844.     /* 初期化 */
  845.     *ForumNameLine = '\0';
  846.     for ( num=0; num<21; num++ ) *KNL[ num ] = '\0';
  847.  
  848.     if ( ( fpi=fopen( f_name , "r" ) ) == NULL ) {    /* 起こり得ないエラー */
  849.         er_open( f_name, 0, "isCATLOGFile" );
  850.     };
  851.     fgets( str , LINE , fpi );
  852.  
  853.     num = 0;
  854.     isCATLOGFileSw = StartMesSw = FALSE;
  855.     p2 = str;
  856.     if (         strncmp( str , "FORUM:" , 6 ) == 0 ) {
  857.         p1 = str + 6;
  858.         while ( isalnum( *p1 ) ) *p2++ = *p1++;        *p2 = '\0';
  859.         while ( *p1 == ' ' ) p1++;
  860.         if ( strncmp( p1 , "MES:" , 4 ) == 0 ) {
  861.             p1 += 4;        /* skip 'MES:' */
  862.             num = atoi( p1 );
  863.             StartMesSw = TRUE;
  864.         } else if ( strncmp( p1 , "LIB:" , 4 ) == 0 ) {
  865.             p1 += 4;        /* skip 'LIB:' */
  866.             LibNum = atoi( p1 );
  867.             num = LIB;
  868.         };
  869.         if ( strlen( str ) <= 8 && num != 0 ) {
  870.             strcpy( ForumName , str );    MesNum = num;
  871.         };
  872.     } else if ( strncmp( str , "MAIL:" , 5 ) == 0 ) {
  873.         p1 = str + 5;
  874.         while ( isalnum( *p1 ) ) *p2++ = *p1++;        *p2 = '\0';
  875.         if ( isIDname( str ) == YES ) {
  876.             strcpy( ForumName , str );    MesNum = num = MAIL;
  877.             set_ForumNameLine( MAIL );
  878.         };
  879.     } else if (    strncmp( str , "HP:" , 3 ) == 0 ) {
  880.         p1 = str + 3;
  881.         while ( isalnum( *p1 ) ) *p2++ = *p1++;        *p2 = '\0';
  882.         if ( isIDname( str ) == YES ) {
  883.             strcpy( ForumName , str );    MesNum = num = HP;
  884.             set_ForumNameLine( HP );
  885.         };
  886.     } else if (    strncmp( str , "PATIO:" , 6 ) == 0 ) {
  887.         p1 = str + 6;
  888.         while ( isalnum( *p1 ) ) *p2++ = *p1++;        *p2 = '\0';
  889.         if ( isIDname( str ) == YES ) {
  890.             strcpy( ForumName , str );    MesNum = num = PATIO;
  891.             set_ForumNameLine( PATIO );
  892.         };
  893.     } else if (    strncmp( str , "BILL:BILL" , 9 ) == 0 ) {
  894.         strcpy( ForumName , "BILL" );    MesNum = num = BILL;
  895.     } else if (    strncmp( str , "COLLECT_ID:" , 11 ) == 0 ) {
  896.         p1 = str + 11;
  897.         while ( isalnum( *p1 ) ) *p2++ = *p1++;        *p2 = '\0';
  898.         if ( isIDname( str ) == YES ) {
  899.             strcpy( ForumName , str );    MesNum = num = COLLECT_ID;
  900.         };
  901.     } else if (    strncmp( str , "ALL-MAIL" , 8 ) == 0 ) {
  902.         strcpy( ForumName , "ALL-MAIL" );    MesNum = num= ALL_MAIL;
  903.     } else if (    strncmp( str , "CLIP" , 4 ) == 0 ) {
  904.         strcpy( ForumName , "CLIP" );    MesNum = num = CLIP;
  905.     } else {
  906.         fclose( fpi );    return( 0 );
  907.     };
  908.     if ( num != 0 ) {
  909.         isCATLOGFileSw = TRUE;
  910.         if ( num > 0 ) {
  911.             fgets( ForumNameLine, 80, fpi );
  912.                 without_crlf( ForumNameLine );
  913.             fgets( KNL[0], 80, fpi );
  914.                 without_crlf( KNL[0] );
  915.         };
  916.     };
  917.     fclose( fpi );
  918.     return( num );
  919. }
  920.  
  921. static    int
  922. Check1FileTRUE( const char *f_name , const char *ff_name )
  923. {
  924.     const    char    *p;
  925.             FILE    *fp;
  926.  
  927.     p = last_comma( ff_name );
  928.  
  929.     /********************************/
  930.     /* ファイル指定でチェックしない */
  931.     /* 複数ファイル検索の時である   */
  932.     /********************************/
  933.     if ( isCATLOGFileSw != 0 ) {
  934.         /****************************************/
  935.         /* CATLOGで整理したファイルである */
  936.         /****************************************/
  937.         if ( doOnlyCurrentCATLOGFile == TRUE ) {
  938.             if ( MesNum <= 20 ) {
  939.                 if (    matchstr( "MES%%_00.TXT", ff_name ) == FALSE
  940.                 ) {
  941.                                                     return( FALSE );
  942.                 };
  943.             } else {
  944.                 if (    matchstr( "$$$%%%%%.ML0", ff_name ) == FALSE
  945.                 &&        matchstr( "$$$%%%%%.HP0", ff_name ) == FALSE
  946.                 &&        matchstr( "$$$%%%%%.PA0", ff_name ) == FALSE
  947.                 &&        matchstr( "LIB%%.TXT",    ff_name ) == FALSE
  948.                 ) {
  949.                                                     return( FALSE );
  950.                 };
  951.             };
  952.         };
  953.     } else {
  954.         /******************************/
  955.         /* 普通の生ログファイルである */
  956.         /* 拡張子を調べる             */
  957.         /******************************/
  958. #if    VERIFY == YES
  959.         if ( verify == TRUE ) {
  960.             printf( "Check1FileTRUEです %s の拡張子を調べます\n", f_name );
  961.         };
  962. #endif
  963.         if ( p != ff_name ) {
  964.             p++;
  965.             for( sayNum=0; sayNum<MAX_ATTR; sayNum++ ) {
  966.                 if ( strcmp( p, attr[sayNum] ) == 0 )    return( FALSE );
  967.             };
  968.             for( sayNum=0; sayNum<MAX_ATTR1; sayNum++ ) {
  969.                 if ( strcmp( p, attr1[sayNum] ) == 0 )    return( FALSE );
  970.             };
  971.             /* 1993.8.4 変更 */
  972.             if ( strncmp( p, "$F", 2 ) == 0 )            return( FALSE );
  973.         };
  974.     };
  975.     /****************************************/
  976.     /* 検索するファイルサイズの合計値の計算 */
  977.     /****************************************/
  978.     if ( MaxFileSizeSw == TRUE ) {
  979.         /* ↓ ファイルサイズを調べるもっと良い方法は? */
  980.         SearchFileSize += GetFileSize( f_name );
  981.         /* 規定値より大きくなる時は ファイルを検索しない */
  982.         if ( SearchFileSize > MaxSearchFileSize )        return( FALSE );
  983. #if    VERIFY == YES
  984.         if ( verify == TRUE ) {
  985.             printf( "%8ld\n", SearchFileSize );
  986.         };
  987. #endif
  988.     };
  989.     return( TRUE );
  990. }
  991.  
  992. static    void    OverIdxFile( char *forum, int mes )
  993. {
  994.     char    *p, sub[ 4 ];
  995.  
  996.     sprintf( FileName, "%s%s.$", TmpDir, forum );
  997.     switch( mes ) {
  998.         case BILL:            p = "B0";    break;    /* 利用料金情報 */
  999.         case CLIP:            p = "C0";    break;    /* クリッピングサービス */
  1000.         case HP:            p = "H0";    break;    /* Home Party */
  1001.         case LIB:            p = "L0";    break;    /* LIB */
  1002.         case MAIL:            p = "M0";    break;    /* 電子メール */
  1003.         case PATIO:            p = "P0";    break;    /* PATIO */
  1004.         case NEW:            p = "N0";    break;    /* 「今週のお知らせ」 */
  1005.         default:                /* フォーラムの会議室である */
  1006.             p = sub;    *p++ = 'F';
  1007.             if ( mes < 10 ) {    *p = '0'      + mes;
  1008.             } else {            *p = 'A' - 10 + mes;
  1009.             };
  1010.             *(++p) = '\0';
  1011.             p = sub;
  1012.             break;
  1013.     };
  1014.     strcat( FileName, p );
  1015. }
  1016.  
  1017. int        OverIdxSort( const struct IDX2 *p1 , const struct IDX2 *p2 )
  1018. {
  1019.     /* 次の順序でソートする
  1020.         (1) フォーラム名
  1021.         (2) 会議室番号
  1022.         (3) 発言日時
  1023.         (4) 発言番号
  1024.     */
  1025.     if(p1->ForumName !=p2->ForumName)    return( p1->ForumName -p2->ForumName );
  1026.     if ( p1->MesNum != p2->MesNum )        return( p1->MesNum - p2->MesNum );
  1027.     if ( p1->MesNum == LIB ) {
  1028.         /* LIB は発言番号 → 発言日時 の 順 */
  1029.         if ( p1->SayNum != p2->SayNum )        return( p1->SayNum - p2->SayNum );
  1030.         if ( p1->SayDate < p2->SayDate )    return( -1 );
  1031.         if ( p1->SayDate > p2->SayDate )    return(  1 );
  1032.         return( 0 );
  1033.     } else {
  1034.         if ( p1->SayDate == p2->SayDate )    return( p1->SayNum - p2->SayNum );
  1035.         if ( p1->SayDate < p2->SayDate )    return( -1 );
  1036.         if ( p1->SayDate > p2->SayDate )    return(  1 );
  1037.         return( 0 );
  1038.     };
  1039. }
  1040.  
  1041. void    SortIdx2()
  1042. {
  1043.     int        m0, m1 ;
  1044.  
  1045.     for ( m0 = 0; m0 < idx2P; m0++ ) {
  1046.         if ( idx2[m0].MesNum == NEW ) {
  1047.             sayNum = idx2[m0].SayNum;
  1048.             for ( m1 = m0+1; m1 < idx2P ; m1++ ) {
  1049.                 if ( idx2[m1].MesNum != NEW )        break;
  1050.             };
  1051.             /* m0 ~ m1 が NEW の区間 */
  1052.             HatsugenSu = m1;    sortNEW( m0 );
  1053.             m0 = m1 - 1;        /* m0 を進める */
  1054.         };
  1055.     };
  1056.  
  1057.     /* 次の順序でソートする
  1058.         (1) フォーラム名
  1059.         (2) 会議室番号
  1060.         (3) 発言日時
  1061.         (4) 発言番号
  1062.     */
  1063.     qsort( (char *)idx2, idx2P, sizeof(struct IDX2), OverIdxSort );
  1064. }
  1065.  
  1066. void    OverIdx()
  1067. {
  1068.     int        i, forum, mesNum;
  1069.  
  1070.     SortIdx2();
  1071.  
  1072.     OverIdxSw = TRUE;
  1073.  
  1074.     forum = mesNum = -1;
  1075.     for ( i = 0; i < idx2P ; i++ ) {
  1076.         if (    forum != idx2[i].ForumName
  1077.         ||        mesNum != idx2[i].MesNum
  1078.         ) {
  1079.             forum = idx2[i].ForumName;
  1080.             mesNum = idx2[i].MesNum;
  1081.             OverIdxFile( idxs[idx2[i].ForumName].name, idx2[i].MesNum );
  1082.             if ( CT_fpo != NULL )    fclose( CT_fpo );
  1083.             if ( ( CT_fpo = fopen( FileName, "a")) == NULL ) {
  1084.                 er_open( FileName, 1, "OverIdx" );
  1085.             };
  1086.         };
  1087.         /* 1行目:フォーラム名と会議室番号を書き出す */
  1088.         fprintf( CT_fpo, "%s %2d\n"
  1089.                 , idxs[idx2[i].ForumName].name
  1090.                 , idx2[i].MesNum
  1091.         );
  1092.         /* 2行目:ForumNameLine を書き出す */
  1093.         fprintf( CT_fpo, "%s\n", idxs[idx2[i].ForumNameLine].name );
  1094.         /* 3行目:会議室名の行を書き出す */
  1095.         if ( idx2[i].KNL < 0 ) {fprintf(CT_fpo,"\n" );
  1096.         } else {                fprintf(CT_fpo,"%s\n",idxs[idx2[i].KNL].name );
  1097.         };
  1098.         /* 4行目:ファイル名を書き出す */
  1099.         /* 5行目:発言に関するデータを書き出す */
  1100.         long_to_date( MesNum, str, idx2[i].SayDate );
  1101.         fprintf( CT_fpo, "%s\n%5d %5d %8ld %8ld %5d %5d %s\n"
  1102.                         , idxs[idx2[i].FileName].name
  1103.                         , idx2[i].SayNum
  1104.                         , idx2[i].ComNum
  1105.                         , idx2[i].seek
  1106.                         , idx2[i].blen
  1107.                         , idx2[i].gyou
  1108.                         , idx2[i].glen
  1109.                         , str
  1110.         );
  1111.         /* 6行目:発言の題名 */
  1112.         fprintf( CT_fpo, "%s\n", idx2[i].HyoudaiLine );
  1113.     };
  1114.     fclose( CT_fpo );    CT_fpo = NULL;
  1115.     idx2P = 0;
  1116. }
  1117.  
  1118. int        isIdxS( const char *str )
  1119. {
  1120.     int        i;
  1121.     struct    IDXS    *idxsp;
  1122.  
  1123.     for ( i=0, idxsp=idxs ; i<idxsP ; i++, idxsp++ ) {
  1124.         if ( strcmp( idxsp->name, str ) == 0 )        return( i );
  1125.     };
  1126.     if ( idxsP >= max_idxs ) {
  1127.         /* idxs があふれた場合の処理 */
  1128.         OverIdx();        idxsP = 0;        idxsp = idxs;
  1129.     };
  1130.     strcpy( idxsp->name, str );
  1131.     idxsP++;
  1132.     return( i );
  1133. }
  1134.  
  1135. static    void    Check1FileSave( const char *f_name, long seek )
  1136. {
  1137.     int        i;
  1138.  
  1139.     if ( idx2P >= max_idx2 ) {
  1140.         /* idx2 があふれた場合の処理 */
  1141.         OverIdx();
  1142.     };
  1143.     if ( *ForumName == '\0' )    strcpy( ForumName, "UNKNOWN" );
  1144.     idx2[idx2P].ForumName            = isIdxS( ForumName );
  1145.     idx2[idx2P].MesNum                = MesNum;
  1146.     idx2[idx2P].SayNum                = sayNum;
  1147.     idx2[idx2P].SayDate                = sayDate;
  1148.     /* 登録済のデータ? */
  1149.     /* NEW は全部ロードする */
  1150.     if ( MesNum != NEW ) {
  1151.         for ( i=0; i<idx2P; i++ ) {
  1152.             if (    idx2[i].ForumName    ==    idx2[idx2P].ForumName
  1153.             &&        idx2[i].MesNum        ==    idx2[idx2P].MesNum
  1154.             &&        idx2[i].SayNum        ==    idx2[idx2P].SayNum
  1155.             &&        idx2[i].SayDate        ==    idx2[idx2P].SayDate
  1156.             )                                                        return;
  1157.         };
  1158.     };
  1159.     idx2[idx2P].KNL    = idx2[idx2P].ForumNameLine        = isIdxS( ForumNameLine );
  1160.     if ( 1 <= MesNum && MesNum <= 20 ) {
  1161.         if (*KNL[MesNum]!='\0') {    idx2[idx2P].KNL    = isIdxS( KNL[ MesNum ] );
  1162.         } else {                    idx2[idx2P].KNL    = isIdxS( KNL[ 0 ] );
  1163.         };
  1164.     } else if ( MesNum == PATIO ) {    idx2[idx2P].KNL    =isIdxS( KNL[ 1 ] );
  1165.     };
  1166.     idx2[idx2P].FileName            = isIdxS( f_name );
  1167.     idx2[idx2P].ComNum                = comNum;
  1168.     idx2[idx2P].seek                = seek;
  1169.     idx2[idx2P].blen                = pool_seek_ichi - seek;
  1170.     idx2[idx2P].gyou                = gyou;
  1171.     idx2[idx2P].glen                = LineNumber - gyou;
  1172.     idx2[idx2P].ahure                = 0x00;
  1173.     strcpy(idx2[idx2P].HyoudaiLine, HyoudaiLine );
  1174.     idx2P++;
  1175.     HatsugenSu++;
  1176. #if    VERIFY == YES
  1177.     if ( verify == TRUE ) {
  1178.         printf( "%s %2d %5d %5d %5ld %5ld %s ○\n"
  1179.             , f_name                /* ファイル名 */
  1180.             , MesNum, sayNum, comNum, seek
  1181.             , pool_seek_ichi - seek
  1182.             , str
  1183.         );
  1184.     };
  1185. #endif    /* VERIFY */
  1186. }
  1187.  
  1188. void    Check1File( const char *f_name , const char *ff_name )
  1189. {
  1190.     int        sw;
  1191.     long    seek;
  1192.  
  1193.     if ( kbhit() ) {
  1194.         sw = getch();    ungetch( sw );    if ( sw == ESC )    exit( 1 );
  1195.     };
  1196.  
  1197.     /* CATLOGのインデックス・ファイルを無視する 1993.8.2 追加 */
  1198.     if ( strcmp( ff_name, IDX_FILE_NAME ) == 0 )                return;
  1199.  
  1200.     LibNum = 0;
  1201.     strcpy( ForumName , "UNKNOWN" );
  1202.  
  1203.     /* CATLOGで整理したファイル? */
  1204.     /*    もしそうなら
  1205.             ForumNameLine
  1206.             KNL[ 0 ~ 20 ]
  1207.         が初期化後・設定される
  1208.     */
  1209.     sw = isCATLOGFile( f_name );
  1210.  
  1211. #if    VERIFY == YES
  1212.     if ( verify == TRUE ) {
  1213.         printf( "Check1Fileです %s %2d \n", ForumName, MesNum );
  1214.     };
  1215. #endif
  1216.  
  1217.     /* COLLECT_ID は無視する 1993.8.2 追加 */
  1218.     if ( sw == COLLECT_ID )                                        return;
  1219.  
  1220.     /****************************************/
  1221.     /* 検索するファイルについてチェックする */
  1222.     /****************************************/
  1223.     /* ファイル指定でチェックする? */
  1224.     if ( doFrom1LOGFile == FALSE ) {
  1225.         if ( Check1FileTRUE( f_name, ff_name ) == FALSE )        return;
  1226.     };
  1227.  
  1228. #if    VERIFY == YES
  1229.     if ( verify == TRUE ) {
  1230.         printf( "フォーラム名は<%s>で、会議室番号は %2d です\n"
  1231.             , ForumName, MesNum
  1232.         );
  1233.         printf( "Check1Fileです %s の内容を調べます\n", f_name );
  1234.     };
  1235. #endif
  1236.  
  1237.     /******************/
  1238.     /* 発言の探索開始 */
  1239.     /******************/
  1240.     if ( Display == TRUE ) {
  1241.         printf( "%-8s\t%8ld Bytes\n", f_name, GetFileSize(f_name) );
  1242.     };
  1243.     if ( initial_check_pool( f_name ) == TRUE ) {
  1244.         sw = FALSE;            /* 発言がない場合もある */
  1245.         GET_LINE2 ;            /* 先読み 1993.8.12 追加:バグ修正 */
  1246.         forever {
  1247.             CPDS = PSP;        seek = pool_seek_ichi;
  1248.             /* 発言開始の行? */
  1249.             /*    もしあれば、
  1250.                     HyoudaiLine
  1251.                     hatsugenDate
  1252.                 がセットされる
  1253.             */
  1254.             if (    isHPMes( ) != TRUE
  1255.             &&        isMAILMes( ) != TRUE
  1256.             &&        isPATIOMes( ) != TRUE
  1257.             &&        isFORUMMes( ) != TRUE
  1258.             &&        isNEWMes( ) != TRUE
  1259.             &&        isCLIPMes( ) != TRUE
  1260.             &&        isBILLMes( ) != TRUE
  1261.             &&        isLIBMes( ) != TRUE
  1262.             ) {
  1263.                 GET_LINE2    break;
  1264.                 continue;
  1265.             };
  1266.             if ( MesNum == LIB ) {    gyou = LineNumber - 3;
  1267.             } else {                gyou = LineNumber;
  1268.             };
  1269.             if ( Display == TRUE ) {
  1270.                 sw = TRUE;    /* 発言があったというしるし */
  1271.                 present_str_copy( str );
  1272.                 printf( "%-78s", str );        putchar( 0x0d );
  1273.             };
  1274.  
  1275.             /* 発言の最後を見つける */
  1276.             do {
  1277.                 CPDS = PSP;
  1278.                 GET_LINE2    break;
  1279.             } while ( isMesEnd() == NO );
  1280.  
  1281.             Check1FileSave( f_name, seek );
  1282.             if ( MesNum == LIB ) {
  1283.                 LibNum = 0;
  1284.                 MesNum = 0;
  1285.             };
  1286.         };
  1287.         end_check_pool();
  1288.         if ( Display == TRUE ) {
  1289.             if ( sw == TRUE )    putchar( 0x0a );        /* LF */
  1290.         };
  1291.     } else {
  1292. #if    VERIFY == YES
  1293.         if ( verify == TRUE ) {
  1294.             printf( "<%s>というファイルが見つかりません\n", f_name );
  1295.         };
  1296. #endif
  1297.     };
  1298.  
  1299. #if    VERIFY == YES
  1300.     if ( verify == TRUE ) {
  1301.         printf( "フォーラム名は<%s>です\n", ForumName );
  1302.         printf( "Check1Fileでした %s の内容を調べました\n", f_name );
  1303.     };
  1304. #endif
  1305. }
  1306.  
  1307. /* DIVIDE_END */
  1308.  
  1309. /* DIVIDE_START=file.c */
  1310. /*
  1311.     GUI-CATLOG補助プログラム            file.c
  1312.  
  1313.         1993.5.10
  1314.  
  1315.  このファイルでは、ファイルの入出力の高速化の為の処理を定義している。
  1316. */
  1317.  
  1318. #include    "ct.h"
  1319.  
  1320. /* 広域変数 */
  1321. char    *catlog_pool=NULL;
  1322. char    *CPDS;    /* check pool delete start */
  1323. char    *LSP , *PSP , *NSP;
  1324. int        LSL , PSL , NSL;
  1325. long    pool_seek_ichi;    /* ファイルの中での位置 */
  1326.  
  1327. /* 局所変数 */
  1328. static    char    *sentinel;                    /* 文章の最後 */
  1329. static    FILE    *pool_fpi = NULL;
  1330. static    char    *check_sentinel , *check_head , *pool_end;
  1331. static    int        catlog_fread_char;
  1332. static    int        catlog_fread_char_sw = NO;
  1333.  
  1334. static    void    delete_line( char *start , char *end )
  1335. {
  1336.     long    len;
  1337.  
  1338.     if ( start == end )        return;
  1339.     if ( start == NULL )    return;
  1340.     if ( end == NULL )        return;
  1341.  
  1342.     if ( start < catlog_pool || end < catlog_pool ) {
  1343.         sprintf(str,"delete_line 管理領域を破壊します<%ld> <%ld>",
  1344.             start - catlog_pool,
  1345.             end - catlog_pool
  1346.         );
  1347.         puts( str );    exit( 1 );
  1348.     };
  1349.  
  1350.     len = end - start;
  1351.     memmove( start , end , check_sentinel - end );
  1352.  
  1353.     /********************/
  1354.     /* ポインタ類の更新 */
  1355.     /********************/
  1356.     if ( start < LSP && LSP < end ) {        LSP = start;
  1357.     } else if ( end <= LSP ) {                LSP = LSP - len;
  1358.     };
  1359.  
  1360.     if ( start < PSP && PSP < end ) {        PSP = start;
  1361.     } else if ( end <= PSP ) {                PSP = PSP - len;
  1362.     };
  1363.  
  1364.     if ( start < NSP && NSP < end ) {        NSP = start;
  1365.     } else if ( end <= NSP ) {                NSP = NSP - len;
  1366.     };
  1367.  
  1368.     if ( start < check_head && check_head < end ) {        check_head = start;
  1369.     } else if ( end <= check_head ) {            check_head = check_head - len;
  1370.     };
  1371.  
  1372.     if ( start < sentinel && sentinel < end ) {        sentinel = start;
  1373.     } else if ( end <= sentinel ) {                    sentinel = sentinel - len;
  1374.     };
  1375.  
  1376.     if ( start < CPDS && CPDS < end ) {        CPDS = start;
  1377.     } else if ( end <= CPDS ) {                CPDS = CPDS - len;
  1378.     };
  1379. }
  1380.  
  1381. static    long    catlog_fread( char *pool1 )
  1382. {
  1383.     int        c, sw;
  1384.     long    len1, len2;
  1385.  
  1386.     sw = 0;
  1387.     if ( catlog_fread_char_sw != NO ) {
  1388.         sw = 1;
  1389.         *pool1++                = catlog_fread_char;
  1390.         catlog_fread_char_sw    = NO;
  1391.     };
  1392.  
  1393.     len1 = check_sentinel - pool1;        /* ロードするバイト数 */
  1394.     if ( len1 < 0 ) {
  1395.         puts("catlog_fread ちゃんと領域を確保してね" );        exit( 1 );
  1396.     };
  1397.  
  1398.     if ( pool1 < catlog_pool ) {
  1399.         sprintf(str,"catlog_fread 管理領域を破壊しますよ。<%ld> ",
  1400.             pool1 - catlog_pool
  1401.         );
  1402.         puts( str );        exit( 1 );
  1403.     };
  1404.  
  1405.     /* ロードしたバイト数 */
  1406.     len2 = fread( pool1 , sizeof(char) , len1 , pool_fpi );
  1407.  
  1408.     if ( len2 < len1 ) {
  1409.         c = fgetc( pool_fpi );        /* set EOF flag */
  1410.         if ( c != EOF ) {
  1411.             catlog_fread_char        = c;
  1412.             catlog_fread_char_sw    = YES;
  1413.         } else {
  1414.             catlog_fread_char_sw    = NO;
  1415.         };
  1416.     };
  1417.  
  1418. #ifdef    TEST
  1419.     printf("%ldバイトロードしたよ。\n" , len2 + sw );
  1420. #endif
  1421.  
  1422.     sentinel = pool1 + len2;
  1423.     return ( len2 + sw );
  1424. }
  1425.  
  1426. static    long    load_sentinel()
  1427. {
  1428.     long    len;
  1429.  
  1430.     if ( catlog_pool <= CPDS ) {
  1431.         delete_line( catlog_pool , CPDS );
  1432.     };
  1433.     if ( sentinel == check_sentinel ) {
  1434.         puts( "確保した作業領域より発言の方が大きいので、"
  1435.                     "データをロードできません。"
  1436.                     "\n処理を終了します"
  1437.         );
  1438.         exit( 1 );
  1439.     };
  1440.     len = catlog_fread( sentinel );
  1441.     return( len );
  1442. }
  1443.  
  1444. static    char    *set_next_str()
  1445. {
  1446.     long    len;
  1447.  
  1448.     NSL= 0;        NSP= check_head;
  1449.  
  1450.     if ( check_head == NULL )    return( PSP );
  1451.  
  1452.     if ( check_head >= sentinel ) {
  1453.         if ( feof( pool_fpi ) != 0 )    {        /* EOF */
  1454.             NSP = check_head = NULL;        return( PSP );
  1455.         };
  1456.         /* 処理済みの行を削除 */
  1457.         len = load_sentinel();
  1458.         /* 以下は必要ないが……… */
  1459.         if ( len == 0L ) {            /* EOF */
  1460.                 NSL = check_head - NSP;    check_head = NULL;    return( PSP );
  1461.         };
  1462.     };
  1463.  
  1464.     forever {
  1465.         if ( *check_head == 0x0d ) {
  1466.             check_head++;
  1467.             if ( *check_head == 0x0a ) check_head++;
  1468.             break;
  1469.         };
  1470.         check_head++;
  1471.         if ( check_head >= sentinel ) {
  1472.             if ( feof( pool_fpi ) != 0 )    break;    /* EOF */
  1473.             /* 処理済みの行を削除 */
  1474.             len = load_sentinel();
  1475.             /* 以下は必要ないが……… */
  1476.             if ( len == 0L ) {            /* EOF */
  1477.                 NSL = check_head - NSP;    check_head = NULL;    return( PSP );
  1478.             };
  1479.         };
  1480.     };
  1481.     NSL = check_head - NSP;
  1482.     return( PSP );
  1483. }
  1484.  
  1485. /********************/
  1486. /* ポインタ群の更新 */
  1487. /********************/
  1488. char    *catlog_fgets()
  1489. {
  1490.     LineNumber++;
  1491.  
  1492.     /* ファイルの中での位置 */
  1493.     if ( NSP != NULL && PSP != NULL )    pool_seek_ichi += (long)(NSP - PSP);
  1494.  
  1495.     LSL = PSL;        LSP = PSP;
  1496.     PSL = NSL;        PSP = NSP;
  1497.  
  1498. #if    VERIFY == YES
  1499.     if ( verify == TRUE ) {
  1500.         present_str_print();
  1501.     };
  1502. #endif
  1503.  
  1504.     return( set_next_str() );
  1505. }
  1506.  
  1507. #if    VERIFY == YES
  1508. void    present_str_print()
  1509. {
  1510.     int        c;
  1511.  
  1512.     c = *(PSP + PSL - 2 );    *(PSP + PSL - 2 ) = '\0';
  1513.     puts( PSP );            *(PSP + PSL - 2 ) = c;
  1514. }
  1515. void    next_str_print()
  1516. {
  1517.     int        c;
  1518.  
  1519.     c = *(NSP + NSL - 2 );    *(NSP + NSL - 2 ) = '\0';
  1520.     puts( NSP );            *(NSP + NSL - 2 ) = c;
  1521. }
  1522. #endif
  1523.  
  1524. /**********************************/
  1525. /* catlog_pool[] の領域を確保する */
  1526. /**********************************/
  1527. void    pool_malloc( )
  1528. {
  1529.     int        sw;
  1530.     long    max, min, tmp, tuika, size, fsize;
  1531.  
  1532.     fsize= (long)MAX_BUFSIZE;
  1533. #if    VERIFY == YES
  1534.     if ( verify == TRUE ) {
  1535.         printf( "pool_malloc(%ld) です",fsize);
  1536.         printf( "未使用メモリーは %u バイトあります\n",coreleft() );
  1537.     };
  1538. #endif
  1539.     /* 1993.3.24 JINX さんよりバグ報告
  1540.     *  fsize が小さいと 0x0d の後ろの 0x0a を追加できなくハングする
  1541.     *  以下の1行追加
  1542.     */
  1543.     if ( fsize < 20 ) fsize = ( fsize + 10 ) * 10;
  1544.     tuika = 10;
  1545.  
  1546.     size = ( fsize + tuika ) * sizeof( char ) ;
  1547.     if ( ( catlog_pool = (char *)malloc( size )) != NULL){
  1548.         check_sentinel = catlog_pool + fsize;
  1549.         pool_end = check_sentinel + tuika;
  1550. #if    VERIFY == YES
  1551.         if ( verify == TRUE ) {
  1552.             printf( "%ld → %ld バイトを確保しました\n" , fsize , size );
  1553.         };
  1554. #endif
  1555.         return;
  1556.     };
  1557.  
  1558.     max = fsize;    min = 0;    tmp = ( max - min ) / 2 + min;
  1559.     sw = FALSE;
  1560.     while ( sw == FALSE ) {
  1561.         size = ( tmp + tuika ) * sizeof( char ) ;
  1562.         if( (catlog_pool = (char *)malloc(size)) == NULL ) {
  1563.             max = tmp;
  1564.         } else {
  1565.             min = tmp;        free( catlog_pool );
  1566.         };
  1567.         tmp = ( max - min ) / 2 + min;
  1568.         if ( tmp < 1 )    er_memory( "pool_malloc" );
  1569.         if ( max == min || max - 1 == min ) sw = TRUE;
  1570.     };
  1571.     catlog_pool = (char *)malloc( size );
  1572.     check_sentinel = catlog_pool + tmp;
  1573.     pool_end = check_sentinel + tuika;
  1574. #if    VERIFY == YES
  1575.     if ( verify == TRUE ) {
  1576.         printf( "%ld → %ld バイトを確保しました\n" , fsize , size );
  1577.     };
  1578. #endif
  1579. }
  1580.  
  1581. /************************************/
  1582. /* FileName のオープンと領域の確保 */
  1583. /************************************/
  1584. int        initial_check_pool( const char *FileName )
  1585. {
  1586.     long    fsize , fsize2;
  1587.  
  1588.     if ( pool_fpi != NULL ) {
  1589.         puts("プログラムのバグです initial_check_pool を2重に呼んでいます");
  1590.         exit( 1 );
  1591.     };
  1592.  
  1593.     fsize = GetFileSize( FileName );
  1594.     if ( fsize <= 0L )                                        return( FALSE );
  1595.  
  1596.     check_head = catlog_pool;
  1597.  
  1598.     CPDS =
  1599.     LSP = PSP = NSP = catlog_pool;
  1600.     LSL = PSL = NSL = LineNumber = 0;
  1601.  
  1602.     catlog_fread_char_sw    = NO;
  1603.  
  1604.     pool_seek_ichi = 0L;    /* ファイルの中での位置 */
  1605.  
  1606.     if ( ( pool_fpi = fopen( FileName, "rb" ) ) == NULL ) {
  1607.         er_open( FileName, 0, "initial_check_pool");
  1608.     };
  1609.  
  1610.     if ( ( fsize2 = catlog_fread( catlog_pool ) ) <= 0 ) {
  1611.         printf("'initial_check_pool'でファイル<%s>をロードできません",
  1612.             FileName
  1613.         );
  1614.         exit( 1 );
  1615.     };
  1616.  
  1617.     if ( fsize == fsize2 ) fgetc( pool_fpi );    /* set EOF flag */
  1618.  
  1619.     set_next_str();
  1620.  
  1621.     return( TRUE );
  1622. }
  1623.  
  1624. /*****************************/
  1625. /* catlog_poolを解放して終了 */
  1626. /*****************************/
  1627. void    end_check_pool()
  1628. {
  1629.     if ( catlog_pool != NULL ) {
  1630.         fclose( pool_fpi );        pool_fpi = NULL;
  1631.     } else {
  1632.         puts( "領域を確保していないのに解放しようとしています" );
  1633.         exit( 1 );
  1634.     };
  1635. }
  1636.  
  1637. static    char    crlf[ 3 ] = { 0x0d , 0x0a , '\0' };
  1638.  
  1639. /****************************************************
  1640.  CT では不要。
  1641. long    catlog_fwrite( FILE *fpo )
  1642. {
  1643.     long    len;
  1644.  
  1645.     if ( PSP == NULL ) {
  1646.         len = fwrite( CPDS, sizeof(char), sentinel - CPDS, fpo );
  1647.         if ( *(sentinel - 1 ) != 0x0a )        fwrite(crlf, sizeof(char), 2, fpo);
  1648.     } else {
  1649.         len = fwrite( CPDS, sizeof(char), PSP - CPDS, fpo );
  1650.         if ( *(PSP - 1 ) != 0x0a )            fwrite(crlf, sizeof(char), 2, fpo);
  1651.     };
  1652.     return( len );
  1653. }
  1654. *****************************************************/
  1655.  
  1656. void    catlog_fprintf( const char *targ , FILE *fpo )
  1657. {
  1658.     int         len;
  1659.  
  1660.     len = strlen( targ );
  1661.     if ( len != 0 ) fwrite( targ , sizeof(char) , len , fpo );
  1662.  
  1663.     fwrite( crlf , sizeof(char) , 2 , fpo );
  1664. }
  1665.  
  1666. void    CT_fcopy( FILE *fpi, long size, FILE *fpo)
  1667. {
  1668.     long    len;
  1669.  
  1670.     if ( pool_fpi != NULL ) {
  1671.         puts( "CT_fcopy の機能は initial_check_pool と同時に使えません" );
  1672.         exit( 1 );
  1673.     };
  1674.     if ( size < 0L ) {
  1675.         /* ファイル末まで copy */
  1676.         forever {
  1677.             /* ロードしたバイト数 */
  1678.             len = fread( catlog_pool, 1, check_sentinel - catlog_pool, fpi);
  1679.             if ( len <= 0L )    break;
  1680.             fwrite( catlog_pool, 1, len, fpo);
  1681.         };
  1682.     } else {
  1683.         while ( size > 0L ) {
  1684.             /* ロードしたバイト数 */
  1685.             len = fread( catlog_pool, 1, check_sentinel - catlog_pool, fpi);
  1686.             /* ファイル末 */
  1687.             if ( len <= 0L )    break;
  1688.             if ( len < size ) {
  1689.                 /* ロードしたバイト数が size より小さい場合 */
  1690.                 fwrite( catlog_pool, 1, len, fpo);
  1691.             } else {
  1692.                 /* ロードしたバイト数が size より大きい場合 */
  1693.                 fwrite( catlog_pool, 1, size, fpo);
  1694.             };
  1695.             size -= len;
  1696.         };
  1697.     };
  1698. }
  1699.  
  1700. long    GetFileSize( const char *FileName )
  1701. {
  1702.     FILE    *fpi;
  1703.     long    res;
  1704.  
  1705.     if ( ( fpi = fopen( FileName, "r" ) ) == NULL )    return( 0L );
  1706.         fseek( fpi, 0L, SEEK_END );
  1707.         res = ftell( fpi );
  1708. /*
  1709.     res = filelength( fileno( fpi ) );
  1710. */
  1711.     fclose(fpi);
  1712.     return( res );
  1713. }
  1714.  
  1715. /* DIVIDE_END */
  1716.  
  1717. /* DIVIDE_START=lib.c */
  1718. /*
  1719.     コメントツリー作成プログラム                                lib.c
  1720.  
  1721.             作 : 山先(NIFTY-ID:GHH01217)
  1722. */
  1723. #include    "ct.h"
  1724.  
  1725. int        isLIBLine()
  1726. {
  1727.     if ( PSL < 40 )                                                return( NO );
  1728.                 /*  0         1         2         3         4 */
  1729.                 /*   123456789 123456789 123456789 123456789  */
  1730.     if ( matchstr(    "???%  $$$%%%%% %%/%%/%% ??????% ???% ? ?",PSP) != TRUE ) {
  1731.         return( NO );
  1732.     };
  1733.     return( YES );
  1734. }
  1735.  
  1736. /*****************************************************
  1737. static    int        isLIBIchiran()
  1738. {
  1739.     if ( PSL < 29 )                                                return( NO );
  1740.     if ( matchstr( "???%  ???%  (???%)  %%/%%   ?",PSP) != TRUE ) {
  1741.         return( NO );
  1742.     };
  1743.     return( YES );
  1744. }
  1745. *******************************************************/
  1746.  
  1747. int        isLIBMes()
  1748. {
  1749.     int        libNum;
  1750.     int        line;
  1751.     FILE    *fpo;
  1752.  
  1753.     if (    isCATLOGFileSw == TRUE
  1754.     &&        MesNum == LIB
  1755.     ) {
  1756.         while ( isLIBLine() != YES ) {
  1757.             CPDS = PSP;        GET_LINE2     break;
  1758.         };
  1759.         sayNum = LibNum;                                /* 発言番号 */
  1760.         comNum = 0;                                        /* コメント元番号 */
  1761.         set_ForumNameLine( LIB );
  1762.         set_hatsugen_date( LIB, PSP, str );
  1763.         sayDate = date_to_long( LIB, str );
  1764.         /* 題名のセット */
  1765.         set_hyoudaiName( LIB );
  1766.         return( TRUE );
  1767.     };
  1768.  
  1769.     if (    matchstr( ">LIB ", PSP ) == TRUE
  1770.     ||        matchstr( ">lib ", PSP ) == TRUE
  1771.     ) {
  1772.         LibNum = atoi( PSP + 6 );
  1773.  
  1774. #if    VERIFY == YES
  1775.     if ( verify == TRUE ) {
  1776.         printf( ">LIB %d があったぞ~\n", LibNum );
  1777.     };
  1778. #endif
  1779.  
  1780.         return( FALSE );
  1781.     };
  1782.  
  1783.     /*              123456789 123456789 123456789 123456 */
  1784.     if ( matchstr("番号 総数 登録済 最新  ライブラリ名", PSP )==TRUE ) {
  1785.         LibNum = 0;
  1786.         SaveTmpKaigishitsuNameLine( LIB );
  1787.         return( FALSE );
  1788.     };
  1789.  
  1790.     if (    matchstr(
  1791.                     "データライブラリ (1:データ一覧  2:検索"
  1792. /*
  1793.                     "  3:アップロード(無料)  4:ダウンロード  E:終了)"
  1794. */
  1795.                     , PSP
  1796.             ) != TRUE
  1797.     )                                                return( FALSE );
  1798.  
  1799.     /* ここから LIB の処理 */
  1800.  
  1801.     libNum = atoi( LSP + 2 );
  1802.     if ( LibNum == 0 ) {
  1803.         if ( libNum != 0 ) {            LibNum = libNum;
  1804.         } else {                        LibNum = 9999;
  1805.         };
  1806.     };
  1807.     GET_LINE2                                         return( FALSE );
  1808.                     /* ↓ FAPX でオートでダウンした場合 */
  1809.     if (    matchstr( ">DIR", PSP ) != TRUE
  1810.     &&        matchstr( ">1",   PSP ) != TRUE
  1811.     )                                                return( FALSE );
  1812.     GET_LINE2                                         return( FALSE );
  1813.     if (    matchstr(
  1814.                 "番号  ID       登録日付 バイト  参照   データ名"
  1815.                 , PSP
  1816.             ) != TRUE
  1817.     )                                                return( FALSE );
  1818.     GET_LINE2                                         return( FALSE );
  1819.     if ( isLIBLine() != YES )                        return( FALSE );
  1820.     MesNum = LIB;
  1821.     sayNum = (long)LibNum;                            /* 発言番号 */
  1822.     comNum = 0;                                        /* コメント元番号 */
  1823.     set_ForumNameLine( LIB );
  1824.     set_hatsugen_date( LIB, PSP, str );
  1825.     sayDate = date_to_long( LIB, str );
  1826.     /* 題名のセット */
  1827.     set_hyoudaiName( LIB );
  1828.     return( TRUE );
  1829. }
  1830.  
  1831. /* DIVIDE_END */
  1832.  
  1833. /* DIVIDE_START=load.c */
  1834. /*
  1835.     コメントツリー作成プログラム                                load.c
  1836.  
  1837.             作 : 山先(NIFTY-ID:GHH01217)
  1838. */
  1839. #include    "ct.h"
  1840.  
  1841. void    Copy1Say( long seek, long mojiSu )
  1842. {
  1843.     int        sw;
  1844.  
  1845.     if ( kbhit() ) {
  1846.         sw = getch();    ungetch( sw );    if ( sw == ESC )    exit( 1 );
  1847.     };
  1848.  
  1849.     if (    *FileNameSub == '\0'
  1850.     ||        strcmp( FileNameSub , FileName ) != 0
  1851.     ) {
  1852. #if    VERIFY == YES
  1853.         if ( verify == TRUE ) {
  1854.             printf( "Copy1Say です %s を新たにオープンします\n", FileName );
  1855.         };
  1856. #endif
  1857.         if ( CT_fpiText != NULL )    fclose( CT_fpiText );
  1858.         if ( ( CT_fpiText = fopen( FileName, "rb" ) ) == NULL ) {
  1859.             er_open(FileName,0, "Copy1Say");
  1860.         };
  1861.         strcpy( FileNameSub, FileName );
  1862. #if    VERIFY == YES
  1863.     } else {
  1864.         if ( verify == TRUE ) {
  1865.             printf( "Copy1Say です %s からそのまま発言本体を得ます\n"
  1866.                 , FileName
  1867.             );
  1868.         };
  1869. #endif
  1870.     };
  1871.  
  1872.     fseek( CT_fpiText, seek, SEEK_SET);
  1873.     CT_fcopy( CT_fpiText, mojiSu, CT_fpoText);
  1874. }
  1875.  
  1876. static    int        loadSubSw;
  1877. static    int        commentLevel;
  1878.  
  1879. int        loadSub( FILE *fpi )
  1880. {
  1881.     char    *p;
  1882.     int         glen;
  1883.     long    seek, blen;
  1884.  
  1885.     /* フォーラム名の行 */
  1886.     if ( fgets( ForumNameLine, 80, fpi ) == NULL )            return( FALSE );
  1887.  
  1888.     /* 発言に関するデータ */
  1889.     if ( fgets( str, LINE, fpi ) == NULL )                    return( FALSE );
  1890.     sscanf( str, "%5d %5d %8ld %8ld %5d %5d %10s %2d"
  1891.                     , &sayNum    , &comNum    , &seek    , &blen
  1892.                     , &gyou        , &glen        , str    , &CommentLevel
  1893.     );
  1894.  
  1895.     /* 終了? */
  1896.     if ( CommentLevel <= commentLevel )                        return( FALSE );
  1897.  
  1898.     if ( strncmp( ForumNameLine, "CHANGE:", 7 ) == 0 ) {    loadSubSw = FALSE;
  1899.     } else {
  1900.         /* TXF 用の行を出力する? */
  1901.         if (    loadSubSw == FALSE
  1902.         ||        strncmp( ForumNameLine + 15, "LIB:", 4 ) == 0
  1903.         ) {                    /* この行を書き出す */
  1904.             without_crlf( ForumNameLine );
  1905.             catlog_fprintf( ForumNameLine, CT_fpoText );    loadSubSw = TRUE;
  1906.         };
  1907.     };
  1908.  
  1909.     /* ファイル名 */
  1910.     if ( fgets( str, LINE, fpi ) == NULL )                    return( FALSE );
  1911.         without_crlf( str );
  1912.     if ( strlen( str ) > MAX_FILENAME_LEN ) {
  1913.         str[ MAX_FILENAME_LEN -1 ] = str[ MAX_FILENAME_LEN -2 ] = '\0';
  1914.     };
  1915.     strcpy( FileName, str );
  1916.  
  1917.     /* commentLevel の調整 */
  1918.     if ( commentLevel == -999 ) {        /* 第1発言の場合 */
  1919.         p = ForumNameLine;
  1920.         if ( strncmp( p, "CHANGE:", 7 ) == 0 )    p += 7;
  1921.         if (    strncmp( p, "FORUM", 5 ) != 0
  1922.         &&        strncmp( p, "PATIO", 5 ) != 0
  1923.         ) {                commentLevel = -1;
  1924.         } else {        commentLevel = CommentLevel;
  1925.         };
  1926.     };
  1927.  
  1928.     /* 発言の本体をファイルに書き出す? */
  1929.     if ( CommentLevel >= 0 )            Copy1Say( seek, blen );
  1930.  
  1931.     return( TRUE );
  1932. }
  1933.  
  1934. /* line が comtree0.tmp の行数を表す */
  1935. void    load( int line )
  1936. {
  1937.     int        i ;
  1938.     FILE    *fpi;
  1939.  
  1940.     /* comtree.tmp ファイルのオープン */
  1941.     set_tmp_file_name( COMTREE_TMP_FILE, FileName );
  1942.     if ( ( fpi = fopen( FileName, "r" ) ) == NULL )                    return;
  1943.  
  1944.     /* comtxt.tmp ファイルのオープン */
  1945.     set_tmp_file_name( COMTXT_TMP_FILE, FileName );
  1946.     if ((CT_fpoText=fopen(FileName,"wb"))==NULL) er_open(FileName,1,"load");
  1947.  
  1948.     /* 指定の部分以前を読み飛ばす */
  1949.     line = ( line - 1 ) * 3 ;            /* comtree.tmp の行数 */
  1950.     for ( i = 0; i < line ; i++ )        fgets( str, LINE, fpi );
  1951.  
  1952.     /* 最初の発言について処理する */
  1953.     *FileNameSub = '\0';    CT_fpiText = NULL;
  1954.     loadSubSw = FALSE;        commentLevel = -999;    loadSub( fpi );
  1955.  
  1956.     forever {
  1957.         if ( loadSub( fpi ) == FALSE )        break;
  1958.     };
  1959.     fclose( fpi );
  1960.     fclose( CT_fpiText );
  1961.     fclose( CT_fpoText );
  1962.  
  1963.     /* ここから直性終了する */
  1964.     exit( 0 );
  1965. }
  1966.  
  1967. /* DIVIDE_END */
  1968.  
  1969. /* DIVIDE_START=main.c */
  1970. /*
  1971.     コメントツリー作成プログラム                                main.c
  1972.  
  1973.             作 : 山先(NIFTY-ID:GHH01217)
  1974. */
  1975. #define        MAIN    1
  1976. #include    "ct.h"
  1977.  
  1978. #include    <process.h>
  1979.  
  1980.     char    *Version = VERSION;
  1981.  
  1982. static    void    useage()
  1983. {
  1984.     printf(
  1985.         " コメントツリー作成プログラム\t\t%s\n\t\t\t\t\tVersion=%s"
  1986.         " by .. GHH01217 山先\n\n"
  1987.         , FileName        /* 起動ドライブが入っている */
  1988.         , Version
  1989.     );
  1990.     puts(
  1991.         "\t使い方:ct [-options]  [-o OutDir名]  InputDir名 or File名\n"
  1992.     );
  1993.     puts(
  1994. "   ↓: option            ↓: デフォルト\n"
  1995. #if    VERIFY == YES
  1996. " ★★ 下の2つのオプションは非公開のオプションです ★★\n"
  1997. " コメントレベルの深さ → u : デフォルトで          U数 : 数レベルまで\n"
  1998. " 動作状態を表示       → v : しない            V   : する\n"
  1999. "\n"
  2000. " ★★ ここから下が公開オプションです               ★★\n"
  2001. #endif
  2002. " CATLOGで整理したファイル → a : 全てのファイルを検索  A   : カレント・ファイルのみ検索\n"
  2003. " 標題等を画面に       → d : 表示する          D   : 表示しない\n"
  2004. " 検索するファイルのサイズ   → f : サイズで中断しない  F数 : 数Kバイトまで検索\n"
  2005. " サブ・ディレクトリのファイルを  → r : 検索する          R   : 検索しない\n"
  2006. " 発言の本体を         → t : 出力する          T   : 出力しない\n"
  2007. " 標題は               → 2 : ツリーの構造で       1   : ベタで\n"
  2008. "\n"
  2009. " @ファイル名 で、ファイルからオプションスイッチを入力する\n"
  2010. " -o の次の引数は、出力ディレクトリを指定して下さい\n"
  2011.     );
  2012.     printf(
  2013. " 読み飛ばす拡張子の表示  z ( %d 個 + 20 個 あります )\n"
  2014.         , MAX_ATTR + MAX_ATTR1
  2015.     );
  2016. }
  2017.  
  2018. int        mallocIdx2()
  2019. {
  2020.     int        sw;
  2021.     long    max, min, tmp, size;
  2022.  
  2023.     max = ( 64L * 1024L ) / (long)sizeof(struct IDX2);
  2024.     min = 0;    tmp = ( max - min ) / 2 + min;
  2025.     sw = FALSE;
  2026.     while ( sw == FALSE ) {
  2027.         size = tmp * sizeof(struct IDX2) ;
  2028.         if( (idx2 = (struct IDX2 *)malloc(size))==NULL){    max = tmp;
  2029.         } else {                                        min = tmp;    free(idx2);
  2030.         };
  2031.         tmp = ( max - min ) / 2 + min;
  2032.         if ( tmp < 1 )    er_memory( "mallocIdx2 idx2" );
  2033.         if ( max == min || max - 1 == min ) sw = TRUE;
  2034.     };
  2035.     size = tmp * sizeof(struct IDX2) ;
  2036.     idx2 = (struct IDX2 *)malloc( size );
  2037.     max_idx2 = tmp;
  2038.  
  2039. /*
  2040.     printf( "%d 個のデータを処理できます(IDX2)\n",tmp);
  2041. */
  2042.  
  2043. /*
  2044.     max = tmp * (long)sizeof(struct IDXS);
  2045. */
  2046.     max = ( 64L * 1024L ) / (long)sizeof(struct IDXS);
  2047.     min = 0;    tmp = ( max - min ) / 2 + min;
  2048.     sw = FALSE;
  2049.     while ( sw == FALSE ) {
  2050.         size = tmp * sizeof(struct IDXS) ;
  2051.         if( (idxs = (struct IDXS *)malloc(size))==NULL){    max = tmp;
  2052.         } else {                                        min = tmp;    free(idxs);
  2053.         };
  2054.         tmp = ( max - min ) / 2 + min;
  2055.         if ( tmp < 1 )    er_memory( "mallocIdx2 idxs" );
  2056.         if ( max == min || max - 1 == min ) sw = TRUE;
  2057.     };
  2058.     /* 標準関数の為に残すリアルメモリー容量 */
  2059.     max = ( 8L * 1024L ) / (long)sizeof(struct IDXS);
  2060.     tmp -= max;
  2061.     if ( tmp < 1 )        er_memory( "mallocIdx2 idxs" );
  2062.     size = tmp * sizeof(struct IDXS) ;
  2063.     idxs = (struct IDXS *)malloc( size );
  2064.     max_idxs = tmp;
  2065.  
  2066. /*
  2067.     printf( "%d 個のデータを処理できます(IDXS)\n",tmp);
  2068. */
  2069.     return( tmp );
  2070. }
  2071.  
  2072. int        mallocIdx()
  2073. {
  2074.     int        sw;
  2075.     long    max, min, tmp, size;
  2076.  
  2077.     max = ( 64L * 1024L ) / (long)sizeof(struct IDX);
  2078.     min = 0;    tmp = ( max - min ) / 2 + min;
  2079.     sw = FALSE;
  2080.     while ( sw == FALSE ) {
  2081.         size = tmp * sizeof(struct IDX) ;
  2082.         if( (idx = (struct IDX *)malloc(size))==NULL){    max = tmp;
  2083.         } else {                                        min = tmp;    free(idx);
  2084.         };
  2085.         tmp = ( max - min ) / 2 + min;
  2086.         if ( tmp < 1 )    er_memory( "mallocIdx" );
  2087.         if ( max == min || max - 1 == min ) sw = TRUE;
  2088.     };
  2089.     size = tmp * sizeof(struct IDX) ;
  2090.     idx = (struct IDX *)malloc( size );
  2091.     max_idx = tmp;
  2092.  
  2093. /*
  2094.     printf( "%d 個のデータを処理できます(IDX)\n",tmp );
  2095. */
  2096.     return( tmp );
  2097. }
  2098.  
  2099. static    void    er_option( char *mes )
  2100. {
  2101.     puts( mes );    exit(1);
  2102. }
  2103.  
  2104. static    void    main_loop()
  2105. {
  2106.             int        done ;
  2107.     struct    ffblk    ffblk;
  2108.             char    inputDir[ MAX_FILENAME_LEN ], *p1, *p2;
  2109.  
  2110. #if    VERIFY == YES
  2111.         if ( verify == TRUE ) {
  2112.             printf( "main_loopです <%s>を調べます\n", InputDir );
  2113.         };
  2114. #endif
  2115.  
  2116.     CT_fpo = NULL;
  2117.  
  2118.     if ( ( CT_fpi = fopen( InputDir, "r" ) ) != NULL ) {
  2119. #if    VERIFY == YES
  2120.         if ( verify == TRUE ) {
  2121.             printf( "<%s>ファイル指定\n", InputDir );
  2122.         };
  2123. #endif
  2124.         fclose( CT_fpi );
  2125.         /****************************/
  2126.         /* ファイル名として処理する */
  2127.         /****************************/
  2128.         p1 = (char *)last_yen( InputDir );
  2129.         if ( p1 != InputDir )    p1++;    /* p1 : ファイル名 */
  2130.         /**********************************************/
  2131.         /* ファイルの存在をチェックしてから処理を行う */
  2132.         /**********************************************/
  2133.         doFrom1LOGFile = TRUE;
  2134.         Check1File( InputDir, p1 );
  2135.         return;
  2136.     };
  2137.  
  2138.     doFrom1LOGFile = FALSE;
  2139.  
  2140.     /*************************************/
  2141.     /* InputDir ワイルドカード指定の場合 */
  2142.     /*************************************/
  2143.     done = findfirst( InputDir , &ffblk , 0 );    /* ファイルを指定 */
  2144.     if ( ! done ) {
  2145. #if    VERIFY == YES
  2146.         if ( verify == TRUE ) {
  2147.             printf( "<%s>ワイルドカード指定\n", InputDir );
  2148.         };
  2149. #endif
  2150.         strcpy( inputDir, InputDir );
  2151.         p1 = inputDir;    if ( *(p1+1) == ':' )    p1 += 2;
  2152.         p2 = (char *)last_yen( p1 );
  2153.         *p2 = '\0';
  2154.         append_yen( inputDir );
  2155.         while ( ! done ) {
  2156.             strcpy( InputDir, inputDir );    strcat( InputDir, ffblk.ff_name );
  2157.             if ( ffblk.ff_attrib != FA_DIREC ) {
  2158.                 /****************************/
  2159.                 /* ファイル名として処理する */
  2160.                 /****************************/
  2161.                 Check1File( InputDir, ffblk.ff_name );
  2162.             };
  2163.             done = findnext( &ffblk );
  2164.         };
  2165.         return;
  2166.     };
  2167.  
  2168.     /***********************************************************/
  2169.     /* InputDir がディレクトリ指定 or ワイルドカード指定の場合 */
  2170.     /***********************************************************/
  2171. #if    VERIFY == YES
  2172.         if ( verify == TRUE ) {
  2173.             printf( "<%s>ディレクトリ指定\n", InputDir );
  2174.         };
  2175. #endif
  2176.     /* InputDir の最後が \ の場合は削除する */
  2177.     p1 = InputDir;        while ( *p1 ) p1++;
  2178.     p1--;
  2179.     if ( p1 != InputDir && *p1 == '\\' )    *p1 = '\0';
  2180.  
  2181.     p1 = InputDir;    if ( *(p1+1) == ':' )    p1 += 2;
  2182.  
  2183.     /* ドライブ指定の場合は          *.* を追加する */
  2184.     if ( *p1 == '\0' ) {
  2185.         /* inputDir の設定 */
  2186.         strcpy( inputDir, InputDir );
  2187.     } else {
  2188.         append_yen( InputDir );
  2189.         /* inputDir の設定 */
  2190.         strcpy( inputDir, InputDir );
  2191.     };
  2192.     strcat( InputDir, "*.*" );
  2193. #if    VERIFY == YES
  2194.         if ( verify == TRUE ) {
  2195.             printf( "InputDir=<%s> inputDir=<%s>\n", InputDir, inputDir );
  2196.         };
  2197. #endif
  2198.     done = findfirst( InputDir , &ffblk , FA_DIREC );    /* Directory を指定 */
  2199.     while ( ! done ) {
  2200.         strcpy( InputDir, inputDir );    strcat( InputDir, ffblk.ff_name );
  2201.         if ( ffblk.ff_attrib == FA_DIREC ) {
  2202.             if ( NoSubDirSw != TRUE ) {
  2203.                 if (    strcmp( ffblk.ff_name , "." ) != 0
  2204.                 &&        strcmp( ffblk.ff_name , ".." ) != 0
  2205.                 ) {
  2206.                     /********************************/
  2207.                     /* ディレクトリ名として処理する */
  2208.                     /********************************/
  2209.                     append_yen( InputDir );
  2210.                     ct_findfirst( InputDir, Check1File );
  2211.                 };
  2212.             };
  2213.         } else {
  2214.             /****************************/
  2215.             /* ファイル名として処理する */
  2216.             /****************************/
  2217.             Check1File( InputDir, ffblk.ff_name );
  2218.         };
  2219.         done = findnext( &ffblk );
  2220.     };
  2221.     return;
  2222. }
  2223.  
  2224. #define        NONE_OPTION        0x00
  2225. #define        INPUT_OPTION    0x01
  2226. #define        OUTPUT_OPTION    0x02
  2227. #define        LOAD_OPTION        0x04
  2228. /* 1993.9.15 削除 ******
  2229. #define        LHA_e_OPTION    0x08
  2230. #define        LHA_E_OPTION    0x10
  2231. ************************/
  2232. #define        TMP_OPTION        0x20
  2233.  
  2234. static    int        setOptions( const char *p )
  2235. {
  2236.     int        i, result;
  2237.     char    *p2;
  2238.     char    str[ 128 ];
  2239.  
  2240.     if ( *p == '-' || *p == '/' )    p++;
  2241.     result = NONE_OPTION;
  2242.     while ( *p ) {
  2243.         switch( *p ) {
  2244. /******** 1993.8.7 コメントアウト **************************************
  2245.             case '?':
  2246.                 useage();
  2247.                 printf( "\n\n"
  2248.                         " また、-z とすると、読み飛ばす拡張子"
  2249.                         "( %d 個)を表示します\n\n"
  2250.                         , MAX_ATTR + MAX_ATTR1
  2251.                 );
  2252.                 exit( 0 );
  2253. *************************************************************************/
  2254.             case '1':    treeMode = 1;                                break;
  2255.             case '2':    treeMode = 0;                                break;
  2256.             case 'A':    doOnlyCurrentCATLOGFile = TRUE;                break;
  2257.             case 'a':    doOnlyCurrentCATLOGFile = FALSE;            break;
  2258.             case 'D':    Display = FALSE ;                            break;
  2259.             case 'd':    Display = TRUE ;                            break;
  2260. /* 1993.9.15 削除 ******
  2261.             case 'e':    result |= LHA_e_OPTION;                        break;
  2262.             case 'E':    result |= LHA_E_OPTION;                        break;
  2263. *****************/
  2264.             case 'F':    MaxFileSizeSw = TRUE;
  2265.                 p++;
  2266.                 p2 = str;    while ( isdigit( *p ) ) {    *p2++ = *p++;    };
  2267.                 *p2 = '\0';
  2268.                 if ( p2 != str ) MaxSearchFileSize = atol( str ) * 1024L;
  2269.                 p--;
  2270.                 break;
  2271.             case 'f':    MaxFileSizeSw = FALSE;
  2272.                 /* 数字を読み飛ばす */
  2273.                 p++;    while ( isdigit( *p ) ) {    p++;    };
  2274.                 p--;
  2275.                 MaxSearchFileSize= 700L* 1024L;
  2276.                 break;
  2277. /*
  2278.             case 'i':    result |= INPUT_OPTION;                        break;
  2279. */
  2280.             case 'l':    result |= LOAD_OPTION;                        break;
  2281.             case 'o':    result |= OUTPUT_OPTION;                    break;
  2282.             case 'R':    NoSubDirSw = TRUE;                            break;
  2283.             case 'r':    NoSubDirSw = FALSE;                            break;
  2284.             case 'T':    /* 発言の本体を出力しない */
  2285.                     NoTextSw = TRUE;                                break;
  2286.             case 't':    /* 発言の本体を出力する */
  2287.                     NoTextSw = FALSE;                                break;
  2288. #if    VERIFY == YES
  2289.             case 'U':
  2290.                     p++;        /* skip 'u' */
  2291.                     level_comment = atoi( p ) * 2;
  2292.                     while( isdigit( *p ) ) p++;
  2293.                     p--;    /* 1バイト戻しておく */
  2294.                     if ( level_comment > LEVEL_COMMENT ) {
  2295.                         level_comment = LEVEL_COMMENT;
  2296.                     };
  2297.                     break;
  2298.             case 'u':
  2299.                     p++;        /* skip 'U' */
  2300.                     while( isdigit( *p ) ) p++;
  2301.                     p--;    /* 1バイト戻しておく */
  2302.                     level_comment = LEVEL_COMMENT;
  2303.                     break;
  2304.             case 'v':    verify = FALSE;                                break;
  2305.             case 'V':    verify = TRUE;                                break;
  2306. #else
  2307.             case 'v':                                                break;
  2308.             case 'V':                                                break;
  2309. #endif
  2310.             case 'w':    result |= TMP_OPTION;                        break;
  2311.             case 'z':    /* 読み飛ばす拡張子を表示する */
  2312.                 spawnlp( P_WAIT, "vmap", "vmap", NULL);
  2313.                 printf( "%d 個のデータを処理できます(IDX2)\n",max_idx2);
  2314.                 printf( "%d 個のデータを処理できます(IDXS)\n",max_idxs);
  2315.                 free( idx2 );    free( idxs );        mallocIdx();
  2316.                 printf( "%d 個のデータを処理できます(IDX)\n",max_idx);
  2317.                 puts( "読み飛ばす拡張は次の通りです" );
  2318.                 for (i=0; i<MAX_ATTR; i++ )        printf( "%s\t", attr[i]);
  2319.                 for (i=0; i<MAX_ATTR1; i++ )    printf( "%s\t", attr1[i]);
  2320.                 puts( "\n次の拡張子も読み飛ばされます" );
  2321.                 puts( "$F0 ~ $F9 , $FA ~ $FK" );
  2322.                 exit( 0 );
  2323.             default:
  2324.                 sprintf(str,"オプションの指定(%c)が間違っています", *p );
  2325.                 er_option( str );
  2326.         };
  2327.         p++;
  2328.     };
  2329.     return( result );
  2330. }
  2331.  
  2332. /* str のファイルを検索して TMP ファイルを作る */
  2333. /* 1993.9.15 削除 *******
  2334. static    void    Lha_e_Option( char *str )
  2335. {
  2336.     strcpy( InputDir, str );        append_yen( InputDir );
  2337.     ct_findfirst( InputDir, Check1File );
  2338.     fclose( CT_fpo );    CT_fpo = NULL;
  2339.     OverIdx();
  2340.     free( idx2 );    free( idxs );
  2341.     if ( Display == TRUE ) {
  2342.         if ( HatsugenSu != 0 ) {
  2343.             printf( "%d 個の発言がありました\n", HatsugenSu );
  2344.         } else {
  2345.             puts(   "発言が見つかりませんでした" );
  2346.         };
  2347.     };
  2348.     exit( 0 );
  2349. }
  2350. **************************/
  2351.  
  2352. /* DEF FILE 指定 */
  2353. static    void    main_loop_file( const char *file )
  2354. {
  2355.     int        sw;
  2356.     FILE    *fpi;
  2357.  
  2358.     file++;
  2359.     if ( (fpi=fopen(file,"r")) == NULL )    er_open(file,0,"main_loop_file");
  2360.  
  2361.     while ( fscanf( fpi, "%s", str ) > 0 ) {
  2362.         sw = *str;
  2363.         if ( sw == '@' ) {                        /* DEF FILE 指定 */
  2364.             main_loop_file( str );
  2365.         } else if ( sw == '-' || sw == '/' ) {
  2366.             sw = setOptions( str );
  2367.             if ( (sw & TMP_OPTION) != 0 ) {
  2368.                 /* TMPディレクトリの指定 */
  2369.                 if ( fscanf( fpi, "%s", str ) > 0 ) {
  2370.                     strcpy( TmpDir, str );            append_yen( TmpDir );
  2371.                     /********************************************************/
  2372.                     /* comtxt.tmp comtree.tmp comtree0.tmp 会議室.tmpを削除 */
  2373.                     /********************************************************/
  2374.                     deleteComTreeTmpFile();
  2375.                 } else {
  2376.                     er_option("TMPディレクトリを指定して下さい");
  2377.                 };
  2378.             };
  2379.             if ( (sw & OUTPUT_OPTION) != 0 ) {
  2380.                 /* 出力ディレクトリの指定 */
  2381.                 if ( fscanf( fpi, "%s", str ) > 0 ) {
  2382.                     strcpy( OutDir, str );            append_yen( OutDir );
  2383.                     /********************************************************/
  2384.                     /* comtxt.tmp comtree.tmp comtree0.tmp 会議室.tmpを削除 */
  2385.                     /********************************************************/
  2386.                     deleteComTreeTmpFile();
  2387.                 } else {
  2388.                     er_option("出力するディレクトリを指定して下さい");
  2389.                 };
  2390.             };
  2391.             if ( (sw & LOAD_OPTION) != 0 ) {
  2392.                 if ( fscanf( fpi, "%s", str ) > 0 )        load( atoi( str ) );
  2393.             };
  2394. /* 1993.9.15 削除 *******
  2395.             if ( (sw & LHA_e_OPTION ) != 0 ) {
  2396.                 if ( fscanf( fpi, "%s", str ) > 0 )        Lha_e_Option( str );
  2397.             };
  2398.             if ( (sw & LHA_E_OPTION ) != 0 ) {
  2399.                 SortMainONFile();        exit( 0 );
  2400.             };
  2401. *************************/
  2402.         } else {
  2403.             /* 入力ディレクトリの指定 */
  2404.             strcpy( InputDir, str );
  2405.             main_loop();
  2406.             fclose( CT_fpo );    CT_fpo = NULL;
  2407.         };
  2408.     };
  2409.     fclose( fpi );
  2410. }
  2411.  
  2412. void    main( int argc , char *argv[] )
  2413. {
  2414.     int        sw;
  2415.     char    *p1 ;
  2416.  
  2417. /*
  2418.     printf( "<%d>個の引数があります\n", argc );
  2419.     for ( sw=0; sw<argc; sw++ ) printf( "%2d:%s\n", sw, argv[sw]);
  2420.     printf( "引数は以上でした\n" );
  2421. */
  2422.  
  2423.     strcpy( FileName, argv[0] );    /* 起動ドライブを知る */
  2424.  
  2425.     *InputDir = *OutDir = *TmpDir = '\0';
  2426.  
  2427.     if ( argc == 1 ) {            useage();    exit( 1 );
  2428.     };
  2429.  
  2430.     /* 内部処理用の領域を確保する */
  2431.     pool_malloc( );
  2432.     mallocIdx2();
  2433.  
  2434. /********************************* Test *
  2435.     spawnlp( P_WAIT, "vmap", "vmap", NULL);
  2436.     CT_fpi = fopen( "main.c", "r" );
  2437.     if ( CT_fpi == NULL ) {    printf( "オープンできません" );
  2438.     } else {
  2439.         fgets( str, LINE, CT_fpi );
  2440.         printf( "%s", str );
  2441.     };
  2442.     spawnlp( P_WAIT, "vmap", "vmap", NULL);
  2443.     fclose( CT_fpi );
  2444.     spawnlp( P_WAIT, "vmap", "vmap", NULL);
  2445. *********************************************************/
  2446.  
  2447.  
  2448.     /* MS-DOS の環境変数を読み込む */
  2449.     /*
  2450.         コマンドラインで指定した方が優先権が上になる。
  2451.         そこで、最初に環境変数を得る
  2452.     */
  2453.     p1 = getenv( "TMP" );
  2454.     if ( p1 != NULL ) {        strcpy( TmpDir, p1 );    append_yen( TmpDir );    };
  2455.     p1 = getenv( "CTUSR" );
  2456.     if ( p1 != NULL ) {
  2457.         strcpy( str, p1 );    setOptions( str );
  2458.     };
  2459.  
  2460.     /****************************************************/
  2461.     /* 起動時のカレントディレクトリのファイルを削除する */
  2462.     /* -o 指定が無い場合、必要である                    */
  2463.     /****************************************************/
  2464.     deleteComTreeTmpFile();
  2465.  
  2466.     *ForumNameLine = '\0';
  2467.     HatsugenSu=0;
  2468.  
  2469.     /********************/
  2470.     /* 入力ディレクトリ */
  2471.     /********************/
  2472.     while ( --argc > 0 ) {
  2473.         ++argv;
  2474.         sw = **argv;
  2475.         if ( sw == '@' ) {                            /* DEF FILE 指定 */
  2476.             main_loop_file( *argv );
  2477.         } else if ( sw == '-' || sw == '/' ) {
  2478.             sw = setOptions( *argv );
  2479.             if ( (sw & TMP_OPTION) != 0 ) {
  2480.                 /* 出力ディレクトリの指定 */
  2481.                 if ( --argc > 0 ) {
  2482.                     ++argv;
  2483.                     strcpy( TmpDir, *argv );        append_yen( TmpDir );
  2484.                     /********************************************************/
  2485.                     /* comtxt.tmp comtree.tmp comtree0.tmp 会議室.tmpを削除 */
  2486.                     /********************************************************/
  2487.                     deleteComTreeTmpFile();
  2488.                 } else {
  2489.                     er_option("TMPディレクトリを指定して下さい");
  2490.                 };
  2491.             };
  2492.             if ( (sw & OUTPUT_OPTION) != 0 ) {
  2493.                 /* 出力ディレクトリの指定 */
  2494.                 if ( --argc > 0 ) {
  2495.                     ++argv;
  2496.                     strcpy( OutDir, *argv );        append_yen( OutDir );
  2497.                     /********************************************************/
  2498.                     /* comtxt.tmp comtree.tmp comtree0.tmp 会議室.tmpを削除 */
  2499.                     /********************************************************/
  2500.                     deleteComTreeTmpFile();
  2501.                 } else {
  2502.                     er_option("出力するディレクトリを指定して下さい");
  2503.                 };
  2504.             };
  2505.             if ( (sw & LOAD_OPTION) != 0 ) {
  2506.                 if ( --argc > 0 ) {        ++argv;        load( atoi( *argv ) );    };
  2507.             };
  2508. /* 1993.9.15 削除 *******
  2509.             if ( (sw & LHA_e_OPTION ) != 0 ) {
  2510.                 if ( --argc > 0 ) {        ++argv;        Lha_e_Option( *argv );    };
  2511.             };
  2512.             if ( (sw & LHA_E_OPTION ) != 0 ) {
  2513.                 SortMainONFile();        exit( 0 );
  2514.             };
  2515. *************************/
  2516.         } else {
  2517.             /* 入力ディレクトリの指定 */
  2518.             strcpy( InputDir, *argv );
  2519.             main_loop();
  2520.             fclose( CT_fpo );    CT_fpo = NULL;
  2521.         };
  2522.     };
  2523.  
  2524.     if ( Display == TRUE ) {
  2525.         if ( HatsugenSu != 0 ) {
  2526.             printf( "%d 個の発言がありました\n", HatsugenSu );
  2527.         } else {
  2528.             puts(   "発言が見つかりませんでした" );
  2529.         };
  2530.     };
  2531.  
  2532.     /* comtree.tmp comtree0.tmp を削除する */
  2533.     set_tmp_file_name( COMTXT_TMP_FILE,   FileName );    remove( FileName );
  2534.     set_tmp_file_name( COMTREE_TMP_FILE,  FileName );    remove( FileName );
  2535.     set_tmp_file_name( COMTREE0_TMP_FILE, FileName );    remove( FileName );
  2536.  
  2537.     if ( HatsugenSu > 0 ) {
  2538.         if ( OverIdxSw == FALSE ) {
  2539.             OpenComTreeTmpFile( "main" );
  2540.             SortMainONMemory();
  2541.             free( idx2 );    free( idxs );
  2542.         } else {
  2543.             OverIdx();    /* メモリー上に残っているデータを書き出す */
  2544.             SortMainONFile( );
  2545.         };
  2546.         /* -t option */
  2547.         if ( NoTextSw == FALSE ) {
  2548.             fclose( CT_fpiText );
  2549.             fclose( CT_fpoText );
  2550.         };
  2551.         fclose( CT_fpo0 );
  2552.         fclose( CT_fpo );
  2553.     };
  2554.  
  2555.     /**********************/
  2556.     /* メモリーを解放する */
  2557.     /**********************/
  2558.     free( catlog_pool );
  2559.  
  2560.     /********/
  2561.     /* 終了 */
  2562.     /********/
  2563.     exit( 0 );
  2564. }
  2565. /* DIVIDE_END */
  2566.  
  2567. /* DIVIDE_START=sort.c */
  2568. /*
  2569.     コメントツリー作成プログラム                                sort.c
  2570.  
  2571.             作 : 山先(NIFTY-ID:GHH01217)
  2572. */
  2573.  
  2574. #include    "ct.h"
  2575.  
  2576. /*
  2577. static    int        max_sort1_level=0;
  2578. */
  2579. static    char    sort1_line[ LEVEL_COMMENT + 4 ];
  2580.  
  2581. static    int        sort1( int st0 );
  2582. static    int        ahureSw = FALSE;
  2583.  
  2584. static    int        newForumSw = FALSE;
  2585. static    int        newKaigishitsuSw = FALSE;
  2586.  
  2587. int        sort0LIB( const struct IDX *p1 , const struct IDX *p2 )
  2588. {
  2589.     /* 発言番号→日時の順に並べる */
  2590.     if(p1->SayNum != p2->SayNum )        return( p1->SayNum - p2->SayNum );
  2591.     if ( p1->SayDate < p2->SayDate )    return( -1 );
  2592.     if ( p1->SayDate > p2->SayDate )    return(  1 );
  2593.     return(  0 );
  2594. }
  2595.  
  2596. int        sort0( const struct IDX *p1 , const struct IDX *p2 )
  2597. {
  2598.     if ( p1->SayDate == p2->SayDate )    return( p1->SayNum - p2->SayNum );
  2599.     if ( p1->SayDate <  p2->SayDate )    return( -1 );
  2600.     return( 1 );
  2601. }
  2602.  
  2603. /*********************************************************************/
  2604. /* st 以降の発言で moto と同じコメント元番号の発言のポインタ値を返す */
  2605. /*********************************************************************/
  2606. static    int
  2607. isComNum( int st, const SayLong sayNum, const SayLong moto )
  2608. {
  2609.     if ( OverIdxSw == TRUE ) {
  2610.         st++;
  2611.         for ( ; st < HatsugenSu ; st++ ) {
  2612.             if ( idx[st].SayNum == (SayLong)0 )                    continue;
  2613.             /* 削除してないデータ */
  2614.             if ( idx[st].SayNum <= sayNum ) {
  2615.             /* MAIL , LIB は発言番号の順に並んでいない */
  2616.             if (        MesNum != MAIL
  2617.                 &&        MesNum != LIB
  2618.                 &&        MesNum != CLIP
  2619.                 &&        MesNum != BILL
  2620.                 )                            break;
  2621.             };
  2622.             if (    idx[st].ahure == 0x00
  2623.             &&        idx[st].ComNum == moto
  2624.             )                                                    return( st );
  2625.         };
  2626.     } else {
  2627.         st++;
  2628.         for ( ; st < HatsugenSu ; st++ ) {
  2629.             if ( idx2[st].SayNum == (SayLong)0 )                    continue;
  2630.             /* 削除してないデータ */
  2631.             if ( idx2[st].SayNum <= sayNum ) {
  2632.             /* MAIL , LIB は発言番号の順に並んでいない */
  2633.             if (    MesNum != MAIL
  2634.             &&        MesNum != LIB
  2635.             &&        MesNum != CLIP
  2636.             &&        MesNum != BILL
  2637.             )                                                    break;
  2638.             };
  2639.             if (    idx2[st].ahure == 0x00
  2640.             &&        idx2[st].ComNum == moto
  2641.             )                                                    return( st );
  2642.         };
  2643.     };
  2644.     return( -1 );
  2645. }
  2646.  
  2647. static    void    sort1_sub2_sub()
  2648. {
  2649.     const    char    *p;
  2650.  
  2651.     switch( MesNum ) {
  2652.         case HP:    p = "HP";        break;
  2653.         case MAIL:    p = "MAIL";        break;
  2654.         case NEW:    p = "NEW";        break;
  2655.         case PATIO:    p = "PATIO";    break;
  2656.         case BILL:    p = "BILL";        break;
  2657.         case CLIP:    p = "CLIP";        break;
  2658.         case LIB:    p = "LIB";        break;
  2659.         default:    p = "FORUM";    break;
  2660.     };
  2661.     fprintf( CT_fpo, "CHANGE:%s フォーラム名変更\n", p );
  2662. }
  2663.  
  2664. static    void
  2665. sort1_sub2( const int st, const char *line0 )
  2666. {
  2667.     int        len;
  2668.     char    *p1, *p2, *p3 ;
  2669.     long    seek, mojiSu;
  2670.     char    str1[ 26 ];
  2671.  
  2672. #if    VERIFY == YES
  2673.     if ( verify == TRUE ) {
  2674.         printf( "sort1_sub2 の入口です %ld へ seek します\n"
  2675.                 ,idx[st].seek
  2676.         );
  2677.     };
  2678. #endif
  2679.     if ( OverIdxSw == TRUE ) {
  2680.         fseek( CT_fpi, idx[st].seek, SEEK_SET );
  2681.         /* 2行目:フォーラム名 */
  2682.         fgets(ForumNameLine,80,CT_fpi);
  2683.         /* 3行目:会議室名 */
  2684.         fgets(KNL[0],80,CT_fpi);
  2685.         /* 4行目:ファイル名 */
  2686.         fgets( FileName, LINE, CT_fpi);
  2687.         /* 5行目:発言に関するデータ */
  2688.         fgets( str, LINE, CT_fpi);
  2689.             without_crlf( str );
  2690.             sprintf( str1, " %2d", CommentLevel/2 );
  2691.             strcat( str, str1 );
  2692.         /* 6行目:発言の標題 */
  2693.         fgets( HyoudaiLine, 80, CT_fpi );
  2694.         /* 特殊な処理 */
  2695.         if ( MesNum == LIB ) LibNum = atoi( str );
  2696.         p1 = str;        while ( isspace(*p1) )    p1++;
  2697.         p1 = next_word( p1 );        /* skip 発言番号 */
  2698.         p1 = next_word( p1 );        /* skip コメント番号 */
  2699.         seek = atol( p1 );
  2700.         p1 = next_word( p1 );        /* skip seek 位置 */
  2701.         mojiSu = atol( p1 );
  2702.     } else {
  2703.         /* 2行目:フォーラム名 */
  2704.         strcpy( ForumNameLine,    idxs[idx2[st].ForumNameLine].name );
  2705.         /* 3行目:会議室名 */
  2706.         len = idx2[st].KNL;
  2707.         if ( len < 0 ) {    strcpy( KNL[0], ForumNameLine );
  2708.         } else {            strcpy( KNL[0],    idxs[len].name );
  2709.         };
  2710.         /* 4行目:ファイル名 */
  2711.         strcpy( FileName,        idxs[idx2[st].FileName].name );
  2712.         /* 5行目:発言に関するデータ */
  2713.         long_to_date( MesNum, str1, idx2[st].SayDate );
  2714.         sprintf( str, "%5d %5d %8ld %8ld %5d %5d %10s %2d"
  2715.                     , idx2[st].SayNum
  2716.                     , idx2[st].ComNum
  2717.                     , idx2[st].seek
  2718.                     , idx2[st].blen
  2719.                     , idx2[st].gyou
  2720.                     , idx2[st].glen
  2721.                     , str1
  2722.                     , CommentLevel/2
  2723.         );
  2724.         /* 6行目:発言の標題 */
  2725.         strcpy( HyoudaiLine,    idx2[st].HyoudaiLine );
  2726.         /* 特殊な処理 */
  2727.         if ( MesNum == LIB )    LibNum = idx2[st].SayNum;
  2728.         seek = idx2[st].seek;
  2729.         mojiSu = idx2[st].blen;
  2730.     };
  2731.     without_crlf( ForumNameLine );
  2732.     without_crlf( KNL[0] );
  2733.     without_crlf( FileName );
  2734.     without_crlf( HyoudaiLine );
  2735. #if    VERIFY == YES
  2736.     if ( verify == TRUE ) {
  2737.         printf( "FileName = %s\n", FileName );
  2738.     };
  2739. #endif
  2740.  
  2741.     /* 1993.8.9 追加 フォーラム名変更 */
  2742.     if ( newForumSw == FALSE ) {
  2743.         newForumSw = TRUE;
  2744.             sort1_sub2_sub();
  2745.             /* 2行目の形式の変更 */
  2746.             fputs( "    0     0        0        0     0     0          0 -2\n", CT_fpo );
  2747.             fprintf( CT_fpo ,"%s\n", ForumNameLine );
  2748.             fprintf( CT_fpo0,"%s\n", ForumNameLine );
  2749.             if ( Display == TRUE )        printf("%s\n", ForumNameLine );
  2750.         if ( MesNum == LIB ) newKaigishitsuSw = TRUE;
  2751.     };
  2752.  
  2753.     /* 1993.7.24 追加 会議室の変更 */
  2754.     if ( newKaigishitsuSw == FALSE ) {
  2755.         newKaigishitsuSw = TRUE;
  2756.         if (    ( 1 <= MesNum && MesNum <= 20 )
  2757.         ||        MesNum == PATIO
  2758.         ||        MesNum == LIB
  2759.         ) {
  2760.             /* フォーラムの場合だけ */
  2761.             if ( MesNum == LIB ) {
  2762.                 fputs( "CHANGE:LIB 会議室名変更\n", CT_fpo );
  2763.             } else {
  2764.                 fputs( "CHANGE:MES 会議室名変更\n", CT_fpo );
  2765.             };
  2766.             /* 2行目の形式の変更 */
  2767.             fputs( "    0     0        0        0     0     0          0 -1\n", CT_fpo );
  2768.             fprintf( CT_fpo , "%s\n", KNL[0]);
  2769.             fprintf( CT_fpo0, "%s\n", KNL[0]);
  2770.             if ( Display == TRUE )    printf( "%s\n", KNL[0] );
  2771.         };
  2772.     };
  2773.  
  2774.     /* 1行目 */
  2775. /*
  2776.     fprintf(CT_fpo,"%s\n", ForumNameLine );
  2777. */
  2778.     switch( MesNum ) {
  2779.         case BILL:    sprintf(str1,"BILL");                                break;
  2780.         case CLIP:    sprintf(str1,"CLIP");                                break;
  2781.         case NEW:    sprintf(str1,"NEW");                                break;
  2782.         case HP:    sprintf(str1,"HP:%-8s",ForumName);                    break;
  2783.         case MAIL:    sprintf(str1,"MAIL:%-8s",ForumName);                break;
  2784.         case PATIO:    sprintf(str1,"PATIO:%-8s",ForumName);                break;
  2785.         case LIB:    sprintf(str1,"FORUM:%-8s LIB:%d",ForumName,LibNum);    break;
  2786.         default:    sprintf(str1,"FORUM:%-8s MES:%d",ForumName,MesNum);    break;
  2787.     };
  2788.     fprintf( CT_fpo, "%s\n", str1 );
  2789.  
  2790.     /* 2行目:発言の関するデータ */
  2791.     fprintf( CT_fpo, "%s\n", str );
  2792.  
  2793.     /* 3行目:ファイル名 */
  2794.     fprintf( CT_fpo, "%s\n", FileName );
  2795.  
  2796.     if ( OverIdxSw == TRUE ) {
  2797.         len=idx[st].ahure;    sayNum=idx[st].SayNum;    comNum=idx[st].ComNum;
  2798.     } else {
  2799.         len=idx2[st].ahure;    sayNum=idx2[st].SayNum;    comNum=idx2[st].ComNum;
  2800.     };
  2801.     if ( len != 0 ) {
  2802.         sprintf( str, "%s◆%05u(%05u) %s"
  2803.                         ,line0
  2804.                         ,sayNum
  2805.                         ,comNum
  2806.                         ,HyoudaiLine
  2807.         );
  2808.     } else {
  2809.         sprintf( str, "%s%05u %s", line0, sayNum, HyoudaiLine );
  2810.     };
  2811.  
  2812.     /**********************/
  2813.     /* 1行78文字に制限 */
  2814.     /**********************/
  2815.     p1 = str;        len= 0;
  2816.     while ( *p1 ) {
  2817.         if ( iskanji( *p1 ) ) {        p1++;    len++;        };
  2818.         p1++;    len++;
  2819.         if ( len >=78 ) {    *p1 = '\0';        break;        };
  2820.     };
  2821.  
  2822.     /* 題名(コメントツリー) comtree0.tmp に書き出す */
  2823.     if ( Display == TRUE )        puts( str );
  2824.     fprintf( CT_fpo0, "%s\n", str );
  2825.  
  2826.     /**************************************************/
  2827.     /* 発言の本体をコピーしないのであれば、ここで終了 */
  2828.     /**************************************************/
  2829.     if ( NoTextSw == TRUE ) {            /* -t option */
  2830. #if    VERIFY == YES
  2831.         if ( verify == TRUE ) {
  2832.             puts( "sort1_sub2 を終了します" );
  2833.         };
  2834. #endif
  2835.         return;
  2836.     };
  2837.  
  2838.     /**********************/
  2839.     /* 発言の本体をコピー */
  2840.     /**********************/
  2841.     /* 発言本体の出力ファイルの seek 位置を調べるのであればここで行うこと */
  2842.     switch( MesNum ) {
  2843.         case BILL:    strcpy(str1,"利用料金情報");                    break;
  2844.         case CLIP:    strcpy(str1,"クリッピングサービス");            break;
  2845.         case NEW:    strcpy(str1,"今週のお知らせ");                    break;
  2846.         default:    break;
  2847.     };
  2848.     sprintf( str, "*****log整理(%-21s) %s *****", str1, FileName);
  2849.     catlog_fprintf( str , CT_fpoText );
  2850.  
  2851.     /* この発言を CT_fpoText に書き出す */
  2852.     Copy1Say( seek, mojiSu );
  2853.  
  2854.  
  2855.     /* 発言の本体を書き出す */
  2856.         /* ファイルの最後まで書き出す */
  2857. /*************************
  2858.     if ( mojiSu > 0L ) {
  2859.         seek += mojiSu;
  2860.         while ( ftell( CT_fpiText ) < seek ) {
  2861.             fgets( str, LINE, CT_fpiText );
  2862.             fprintf( CT_fpoText, "%s", str);
  2863.         };
  2864.     } else {
  2865.         while ( fgets( str, LINE, CT_fpiText) != NULL ) {
  2866.             fprintf( CT_fpoText, "%s", str);
  2867.         };
  2868.     };
  2869. ****************************/
  2870.  
  2871. #if    VERIFY == YES
  2872.     if ( verify == TRUE ) {
  2873.         puts( "sort1_sub2 を終了します" );
  2874.     };
  2875. #endif
  2876. }
  2877.  
  2878. static    void    sort1_sub3( const int st1 )
  2879. {
  2880.     int            st2, sw;
  2881.     SayLong        sayNum;
  2882.  
  2883.     /* この発言番号を保存 */
  2884.     if ( OverIdxSw == TRUE ) {    sayNum = idx[st1].SayNum;
  2885.     } else {                    sayNum = idx2[st1].SayNum;
  2886.     };
  2887.  
  2888.     /****************************/
  2889.     /* 第1:この発言を表示する */
  2890.     /****************************/
  2891.     sort1_line[ CommentLevel ] = '\0';        /* 文字列をこのレベルに初期化 */
  2892.  
  2893.     /* st1 以後に同じコメント元番号を持つ発言がある? */
  2894.     if ( OverIdxSw == TRUE ) {    sw = isComNum( st1, sayNum, idx[st1].ComNum );
  2895.     } else {                    sw = isComNum( st1, sayNum, idx2[st1].ComNum );
  2896.     };
  2897.     if (    CommentLevel != 0
  2898.     ||        ahureSw != TRUE
  2899.     ) {
  2900.         if ( sw > 0 ) {        strcat( sort1_line, "┣" );        /* ある */
  2901.         } else {            strcat( sort1_line, "┗" );        /* ない */
  2902.         };
  2903.     };
  2904.     sort1_sub2( st1, sort1_line );            /* この発言をファイルに書き出す */
  2905.     sort1_line[ CommentLevel ] = '\0';        /* 文字列をこのレベルに初期化 */
  2906.  
  2907.     /* 第2:st1 をコメント元番号とする発言を探す */
  2908.     if ( sw > 0 ) {        strcat( sort1_line, "┃" );        /* ある */
  2909.     } else {            strcat( sort1_line, " " );        /* ない */
  2910.     };
  2911.     CommentLevel += 2;    /* レベルを1上げる */
  2912.     /******************/
  2913.     /* レベルチェック */
  2914.     /******************/
  2915. #if    VERIFY == YES
  2916.     if ( CommentLevel >= level_comment ) {
  2917. #else
  2918.     if ( CommentLevel >= LEVEL_COMMENT ) {
  2919. #endif
  2920.         /* コメントの階層が深すぎる場合の処理 */
  2921.         /* この発言をコメント元番号とする発言の ahure を 0x01 にする */
  2922.         st2 = st1 ;
  2923.         if ( OverIdxSw == TRUE ) {
  2924.             while ((st2=isComNum(st2,sayNum,sayNum))>0)    idx[st2].ahure=0x01;
  2925.         } else {
  2926.             while ((st2=isComNum(st2,sayNum,sayNum))>0)    idx2[st2].ahure=0x01;
  2927.         };
  2928.     } else {
  2929.         /* この発言をコメント元番号とする発言を表示する */
  2930.         st2 = st1 ;
  2931.         while ((st2=isComNum(st2,sayNum,sayNum)) > 0 )    sort1( st2 );
  2932.     };
  2933.     CommentLevel -= 2;    /* レベルを1下げる */
  2934.     /* 処理済の発言とする */
  2935.     if ( OverIdxSw == TRUE ) {
  2936.         idx[st1].SayNum = (SayLong)0;    idx[st1].ahure  = 0x00;
  2937.     } else {
  2938.         idx2[st1].SayNum = (SayLong)0;    idx2[st1].ahure  = 0x00;
  2939.     };
  2940. }
  2941.  
  2942. static    int        sort1( int st0 )
  2943. {
  2944.     int            st1, st2, sw;
  2945.     SayLong        moto, sayNum;
  2946.  
  2947. #if    VERIFY == YES
  2948.     if ( verify == TRUE ) {
  2949.         puts( "sort1 の入口です" );
  2950.     };
  2951. #endif
  2952.     /* コメントツリーの深さを調べる部分 */
  2953. /*
  2954.     if ( max_sort1_level < CommentLevel ) {
  2955.         max_sort1_level = CommentLevel;
  2956.         printf( "max_sort1_level = %d\n", max_sort1_level);
  2957.     };
  2958. */
  2959.  
  2960.     /* この発言の発言番号 */
  2961.     if ( OverIdxSw == TRUE ) {
  2962.         while( idx[st0].SayNum  == (SayLong)0 ) {
  2963.             st0++;
  2964.             if ( st0 >= HatsugenSu )                            return( st0 );
  2965.         };
  2966.         moto   = idx[st0].ComNum;
  2967.         sayNum = idx[st0].SayNum;
  2968.     } else {
  2969.         while( idx2[st0].SayNum  == (SayLong)0 ) {
  2970.             st0++;
  2971.             if ( st0 >= HatsugenSu )                            return( st0 );
  2972.         };
  2973.         moto   = idx2[st0].ComNum;
  2974.         sayNum = idx2[st0].SayNum;
  2975.     };
  2976.  
  2977.     for( st2 = st0 ; st2 < HatsugenSu ; st2++ ) {
  2978.         /* 発言番号が0のものは無視する */
  2979.         if ( OverIdxSw == TRUE ) {    sw = idx[st2].SayNum;
  2980.         } else {                    sw = idx2[st2].SayNum;
  2981.         };
  2982.         if ( sw == 0 )                                            continue;
  2983.         /* より小さな発言番号に当たったら終了 */
  2984.         if ( st2 != st0 ) {
  2985.             if ( OverIdxSw == TRUE ) {    sw = (idx[st2].SayNum <= sayNum );
  2986.             } else {                    sw = (idx2[st2].SayNum <= sayNum);
  2987.             };
  2988.             if ( sw ) {
  2989.                 /* 会議室の名前を表示するように */
  2990.                 if ( CommentLevel == 0 ) {
  2991.                     if ( MesNum == NEW ) {            newForumSw = FALSE;
  2992.                     } else if ( MesNum != LIB ) {    newKaigishitsuSw = FALSE;
  2993.                     };
  2994.                 };
  2995.             };
  2996.             break;
  2997.         };
  2998.  
  2999.         if ( CommentLevel == 0 ) {
  3000.             ahureSw = TRUE;
  3001.             for ( st1=st2 ; st1<HatsugenSu ; st1++ ) {
  3002.                 if ( OverIdxSw == TRUE ) {    sw = idx[st1].ahure;
  3003.                 } else {                    sw = idx2[st1].ahure;
  3004.                 };
  3005.                 if ( sw != 0x00    ) {
  3006.                     /* 1行に溢れた発言の処理 */
  3007.                     sort1_sub3( st1 );                /* この発言を表示する */
  3008.                 };
  3009.             };
  3010.             ahureSw = FALSE;
  3011.             /* 1993.8.21 以下のチェックを追加            */
  3012.             /* CommentLevel が 0 の場合は 強制的に表示する */
  3013.             if ( OverIdxSw == TRUE ) {    sw = idx[st2].SayNum;
  3014.             } else {                    sw = idx2[st2].SayNum;
  3015.             };
  3016.             if ( sw != 0 ) {
  3017.                 if ( OverIdxSw == TRUE ) {    idx[st2].ComNum = 0;
  3018.                 } else {                    idx2[st2].ComNum = 0;
  3019.                 };
  3020.                 sort1_sub3( st2 );                    /* この発言を表示する */
  3021.             };
  3022.             continue;
  3023.         };
  3024.         /* コメント元番号が異なれば無視する */
  3025.         if ( OverIdxSw == TRUE ) {        sw = ( idx[st2].ComNum != moto );
  3026.         } else {                        sw = ( idx2[st2].ComNum != moto );
  3027.         };
  3028.         if ( sw )                                            continue;
  3029.         sort1_sub3( st2 );                            /* この発言を表示する */
  3030.     };
  3031.     /* 文字列をこのレベルに初期化する */
  3032.     sort1_line[ CommentLevel ] = '\0';
  3033. #if    VERIFY == YES
  3034.     if ( verify == TRUE ) {
  3035.         printf( "sort1(%d)→st1=%d st2=%d を終了します\n", st0, st1, st2 );
  3036.     };
  3037. #endif
  3038.  
  3039.     return ( st2 );
  3040. }
  3041.  
  3042. static    int        Sort1KaigiIsIndex()
  3043. {
  3044.     int        i;
  3045.     SayLong    sayNum;
  3046.     long    sayDate;
  3047.  
  3048.     /* 1993.8.23 追加 今週のお知らせは、とにかく全部ロードする */
  3049.     if ( MesNum == NEW )                                    return( FALSE );
  3050.  
  3051.     sayNum  = idx[ HatsugenSu ].SayNum;
  3052.     sayDate = idx[ HatsugenSu ].SayDate;
  3053.  
  3054.     for ( i=0; i<HatsugenSu; i++ ) {
  3055.         if( idx[i].SayNum== sayNum && idx[i].SayDate== sayDate ) return(TRUE);
  3056.     };
  3057.     return ( FALSE );
  3058. }
  3059.  
  3060. /* 1993.8.23 追加                                                 */
  3061. /* idx に全部のお知らせが入っている                               */
  3062. /* 発言は番号の小さいものから入っているはずである                 */
  3063. /* そこで、同じ週のお知らせは、日付の一番大きいものに揃えてしまう */
  3064. /* そうすると、うまく日時と番号で処理することができるようになる   */
  3065. void    sortNEW( const int st0 )
  3066. {
  3067.     int        st1, st2;
  3068.     int        i;
  3069.     long    sayDate;
  3070.  
  3071.     if ( OverIdxSw == TRUE ) {
  3072.         for ( st1 = st0 ; st1 < HatsugenSu ; st1++ ) {
  3073.             for ( st2 = st1 ; st2 < HatsugenSu - 1 ; st2++ ) {
  3074.                 if ( idx[st2].SayNum > idx[st2+1].SayNum )    break;
  3075.             };
  3076.             /* st1 ~ st2 の間で 一番大きい発言日時を得る */
  3077.             sayDate = 0L;
  3078.             for ( i = st1 ; i <= st2 ; i++ ) {
  3079.                 if ( sayDate < idx[i].SayDate )    sayDate = idx[i].SayDate;
  3080.             };
  3081.             /* st1 ~ st2 の発言日時を sayDate にしてしまう */
  3082.             for ( i = st1 ; i <= st2 ; i++ )    idx[i].SayDate =sayDate;
  3083.             /* st1 を進める */
  3084.             st1 = st2;
  3085.         };
  3086.     } else {
  3087.         for ( st1 = st0 ; st1 < HatsugenSu ; st1++ ) {
  3088.             for ( st2 = st1 ; st2 < HatsugenSu - 1 ; st2++ ) {
  3089.                 if ( idx2[st2].SayNum > idx2[st2+1].SayNum )    break;
  3090.             };
  3091.             /* st1 ~ st2 の間で 一番大きい発言日時を得る */
  3092.             sayDate = 0L;
  3093.             for ( i = st1 ; i <= st2 ; i++ ) {
  3094.                 if ( sayDate < idx2[i].SayDate )    sayDate = idx2[i].SayDate;
  3095.             };
  3096.             /* st1 ~ st2 の発言日時を sayDate にしてしまう */
  3097.             for ( i = st1 ; i <= st2 ; i++ )    idx2[i].SayDate =sayDate;
  3098.             /* st1 を進める */
  3099.             st1 = st2;
  3100.         };
  3101.     };
  3102. }
  3103.  
  3104. /* 1会議室分のデータのツリーを作る        */
  3105. /* ForumName MesNum を設定してから呼ぶこと */
  3106. static    void    Sort1Kaigi( const char *file )
  3107. {
  3108.     char    *p1;
  3109.     int        i, st;
  3110.     int        OverIdxSw0;
  3111.     long    OverIdxSeek;
  3112.  
  3113. #if    VERIFY == YES
  3114.     if ( verify == TRUE ) {
  3115.         printf( "Sort1Kaigi( %s ) です\n", file );
  3116.     };
  3117. #endif
  3118.  
  3119.     OverIdxSeek = 0L;
  3120. Sort1KaigiLoop:
  3121.     OverIdxSw0 = FALSE;
  3122.  
  3123.     if ( kbhit() ) {
  3124.         i = getch();    ungetch( i );    if ( i == ESC )    exit( 1 );
  3125.     };
  3126.  
  3127.     /* ファイルの内容をロードする */
  3128.     HatsugenSu = 0;
  3129.     if ( initial_check_pool( file ) == TRUE ) {
  3130.         /* 処理できる数より発言の方が大きくなった場合の処理 */
  3131.         while ( pool_seek_ichi < OverIdxSeek ) {
  3132.             CPDS = PSP;
  3133.             GET_LINE2    break;
  3134.         };
  3135.         GET_LINE2 ;                /* 先読み 1行目:フォーラム名 会議室番号 */
  3136.         forever {
  3137.             CPDS = PSP;
  3138.             GET_LINE2    break;        /* 2行目:フォーラム名の行 */
  3139.             idx[HatsugenSu].seek = pool_seek_ichi;
  3140.             present_str_copy( ForumNameLine );
  3141.             /* 3行目:会議室名の行 */
  3142.             GET_LINE2    break;
  3143.             GET_LINE2    break;        /* 4行目:ファイル名 */
  3144.             GET_LINE2    break;        /* 5行目:発言のデータ */
  3145. /*******************************************************
  3146.         発言番号、
  3147.         コメント元番号、
  3148.         ファイル中での位置(seek位置)、
  3149.         発言のバイト数(標題の行の文字数も含みます)
  3150.         発言の開始行
  3151.         発言の終了行
  3152.         発言の日時
  3153. ********************************************************/
  3154.             p1 = PSP;        while ( isspace(*p1) )    p1++;
  3155.             idx[HatsugenSu].SayNum = atol( p1 ) & 0xffff;
  3156.             p1 = next_word( p1 );        /* skip 発言番号 */
  3157.             idx[HatsugenSu].ComNum = atol( p1 ) & 0xffff;
  3158.             p1 = next_word( p1 );        /* skip コメント元番号 */
  3159.             p1 = next_word( p1 );        /* skip (seek位置) */
  3160.             p1 = next_word( p1 );        /* skip 発言のバイト数 */
  3161.             p1 = next_word( p1 );        /* skip 発言の開始行 */
  3162.             p1 = next_word( p1 );        /* skip 発言の終了行 */
  3163.             idx[HatsugenSu].SayDate = date_to_long( MES, p1 );
  3164. #if    VERIFY == YES
  3165.             if ( verify == TRUE ) {
  3166.                 long_to_date( MesNum, str, idx[HatsugenSu].SayDate );
  3167.                 printf( "値  :Say:%05d Com:%05d Seek:%8ld Date:%s\n"
  3168.                                 ,idx[HatsugenSu].SayNum
  3169.                                 ,idx[HatsugenSu].ComNum
  3170.                                 ,idx[HatsugenSu].seek
  3171.                                 ,str
  3172.                 );
  3173.             };
  3174. #endif
  3175.  
  3176.             /* 6行目:発言の題名 */
  3177.             GET_LINE2    break;
  3178.             if ( Sort1KaigiIsIndex() == FALSE ) {
  3179.                 idx[HatsugenSu].ahure = 0x00;
  3180.                 HatsugenSu++;
  3181.                 if ( max_idx <= HatsugenSu ) {
  3182.                     puts( "発言の数が多くて処理できません" );
  3183.                     OverIdxSeek = pool_seek_ichi;
  3184.                     OverIdxSw0 = TRUE;
  3185.                     break;
  3186. /*
  3187.                     exit( 1 );
  3188. */
  3189.                 };
  3190.             };
  3191.             GET_LINE2    break;        /* → フォーラム名 会議室番号 */
  3192.         };
  3193.         end_check_pool();
  3194.     };
  3195.  
  3196. #if    VERIFY == YES
  3197.     if ( verify == TRUE ) {
  3198.         printf( "<%d>個の発言がありました\n", HatsugenSu );
  3199.     };
  3200. #endif
  3201.  
  3202.     if ( HatsugenSu == 0 )        return;
  3203.  
  3204. #if    VERIFY == YES
  3205.     if ( verify == TRUE ) {
  3206.         puts( "まず発言日時でソートし、次に発言番号の順に並べる" );
  3207.     };
  3208. #endif
  3209.     if ( HatsugenSu > 1 ) {
  3210.         switch( MesNum ) {
  3211.             case LIB:
  3212.                 qsort( (char *)idx, HatsugenSu, sizeof(struct IDX), sort0LIB );
  3213.                 break;
  3214.             case NEW:
  3215.                 sortNEW( 0 );
  3216.                 /* 発言日時 発言番号の順でソートする */
  3217.                 qsort( (char *)idx, HatsugenSu, sizeof(struct IDX), sort0 );
  3218.                 /* 同じ発言日時 発言番号のものは 削除する */
  3219.                 for ( st = 0 ; st < HatsugenSu - 1 ; st++ ) {
  3220.                     if (    idx[st].SayNum  == idx[st+1].SayNum
  3221.                     &&        idx[st].SayDate == idx[st+1].SayDate
  3222.                     )    idx[st].SayNum = 0;
  3223.                 };
  3224.                 break;
  3225.             default:
  3226.                 qsort( (char *)idx, HatsugenSu, sizeof(struct IDX), sort0 );
  3227.                 break;
  3228.         };
  3229.     };
  3230.  
  3231.     /**********************/
  3232.     /* ファイルのオープン */
  3233.     /**********************/
  3234.     if ( (CT_fpi=fopen( file, "r") ) == NULL )    er_open(file, 0, "Sort1Kaigi");
  3235.  
  3236. #if    VERIFY == YES
  3237.     if ( verify == TRUE ) {
  3238.         if ( MesNum <= 20 ) {
  3239.             printf( "FORUM:%s\n%5d:%s\n"
  3240.                         ,ForumNameLine,MesNum,KNL[ MesNum ]
  3241.             );
  3242.         } else {
  3243.             printf( " I D :%s %5d\n",ForumNameLine,MesNum);
  3244.         };
  3245.     };
  3246. #endif
  3247.  
  3248.     if (    treeMode == 1
  3249. /*
  3250.     ||        MesNum == MAIL
  3251.     ||        MesNum == LIB
  3252.     ||        MesNum == HP
  3253. */
  3254.     ) {
  3255.         /* 全てのコメント元番号を 0 にする */
  3256.         for ( i=0; i<HatsugenSu; i++ )    idx[i].ComNum = 0;
  3257.     } else {
  3258.         /* 最初の発言番号よりも小さなコメント元番号は 0 にする */
  3259.         sayNum = idx[0].SayNum;        idx[0].ComNum = 0;
  3260.         for ( i=1; i<HatsugenSu; i++ ) {
  3261.             /* 1993.8.21 以下の判定を追加 */
  3262.             if ( idx[i-1].SayNum > idx[i].SayNum ) {
  3263.                 /* この発言番号が前の発言番号よりも小さい場合 */
  3264.                 /* sayNum を変更し idx[i].ComNum を0にする */
  3265.                 sayNum = idx[i].SayNum;
  3266.                 idx[i].ComNum = 0;
  3267.             };
  3268.             if ( idx[i].ComNum < sayNum ) idx[i].ComNum = 0;
  3269.         };
  3270.     };
  3271.  
  3272.     CommentLevel = 0;    *sort1_line = '\0';        i = 0;
  3273.     while ( ( i= sort1(i) ) < HatsugenSu )    ;
  3274.  
  3275. #if    VERIFY == YES
  3276.     /* 処理されなかった発言 */
  3277.     puts( "処理されなかった発言" );
  3278.     st = 0;
  3279.     for ( i=0; i<HatsugenSu; i++ ) {
  3280.         if ( idx[i].SayNum != 0 ) {
  3281.             st++;
  3282.             sort1( i );
  3283.         };
  3284.     };
  3285.     if ( st == 0 ) {        puts(        "ありませんでした" );
  3286.     } else {                printf( "%d 個ありました\n", st );
  3287.     };
  3288. #endif    /* VERIFY */
  3289.  
  3290.     fclose(CT_fpi);
  3291.  
  3292.     /* 処理できる数より大きい場合 */
  3293.     if ( OverIdxSw0 == TRUE )    goto Sort1KaigiLoop;
  3294.  
  3295. #if    VERIFY == YES
  3296.     if ( verify == TRUE ) {
  3297.         printf( "Sort1Kaigi( %s ) を終了します\n", file );
  3298.     };
  3299. #endif
  3300. }
  3301.  
  3302. static    void
  3303. SortMainONFileSub( const char *typ, const int max, const int mes )
  3304. {
  3305.             int        i, done ;
  3306.     struct    ffblk    ffblk;
  3307.     char    *p, FileName[ MAX_FILENAME_LEN ];
  3308.  
  3309.     MesNum = mes;
  3310.  
  3311.     strcpy( FileName, TmpDir);
  3312.     strcat( FileName, "*.$");
  3313.     strcat( FileName, typ);
  3314.     strcat( FileName, "?");
  3315.  
  3316. #if    VERIFY == YES
  3317.     if ( verify == TRUE ) {
  3318.         printf( "SortMainONFileSub <%s>を調べます\n", FileName);
  3319.     };
  3320. #endif
  3321.  
  3322.     if ( ( done = findfirst( FileName, &ffblk, 0) ) != 0 )        return;
  3323.     while ( ! done ) {
  3324.         if ( ffblk.ff_attrib != FA_DIREC ) {
  3325.             /* ファイル名 */
  3326.             strcpy( ForumName, ffblk.ff_name);
  3327.             p = (char *)last_comma( ForumName);
  3328.             if ( p != ForumName )    *p = '\0';        /* ファイル名だけにする */
  3329.  
  3330. #if    VERIFY == YES
  3331.             if ( verify == TRUE ) {
  3332.                 printf( "SortMainONFileSub <%s>が見つかりました\n", ForumName);
  3333.             };
  3334. #endif
  3335. /*
  3336.             if ( MesNum == LIB ) {    newForumSw = TRUE;
  3337.             } else {                newForumSw = FALSE;
  3338.             };
  3339. */
  3340.             newForumSw = FALSE;
  3341.             for ( i=0; i<=max; i++ ) {
  3342.                 if ( i < 10 ) {
  3343.                     sprintf(FileName,"%s%s.$%s%d",TmpDir,ForumName,typ,i);
  3344.                 } else {
  3345.                     sprintf(FileName,"%s%s.$%s%c",TmpDir,ForumName,typ,'A'+i-10);
  3346.                 };
  3347.                 if ( access( FileName, 0 ) == 0 ) {
  3348.                     /* そのファイルについてツリーを作る */
  3349.                     if ( strcmp( typ, "F") == 0 )            MesNum = i;
  3350.                     newKaigishitsuSw = FALSE;
  3351.                     Sort1Kaigi( FileName );
  3352.                     /* 削除する */
  3353.                     remove( FileName );
  3354.                 };
  3355.             };
  3356.             /* typ が F であった場合 DL を表示する */
  3357.             if ( strcmp( typ, "F" ) == 0 ) {
  3358.                 sprintf(FileName,"%s%s.$%s%d",TmpDir,ForumName,"L",0);
  3359.                 if ( access( FileName, 0 ) == 0 ) {
  3360.                     /* そのファイルについてツリーを作る */
  3361. /*
  3362.                     newForumSw = TRUE;
  3363. */
  3364.                     newKaigishitsuSw = FALSE;
  3365.                     MesNum = LIB;
  3366.                     Sort1Kaigi( FileName );
  3367.                     /* 削除する */
  3368.                     remove( FileName );
  3369.                 };
  3370.             };
  3371.         };
  3372.         done = findnext( &ffblk );
  3373.     };
  3374. }
  3375.  
  3376. void    SortMainONFile( )
  3377. {
  3378.     /* ヒープ領域を解放する */
  3379.     free( idx2 );    free( idxs );
  3380.  
  3381.     OverIdxSw = TRUE;
  3382.  
  3383.     /******************************/
  3384.     /* ソートの為の領域を確保する */
  3385.     /******************************/
  3386.     if ( mallocIdx() <= 0 )        er_memory( "mallocIdx" );
  3387.  
  3388.     OpenComTreeTmpFile( "SortMainONFile" );
  3389.  
  3390.     /* 1つにまとめた MAIL ファイルである */
  3391. /*
  3392.     SortMainONFileSub( "A",  0, ALL_MAIL );
  3393. */
  3394.     SortMainONFileSub( "B",  0, BILL );    /* 利用料金情報である */
  3395.     SortMainONFileSub( "C",  0, CLIP );    /* クリッピングサービスである */
  3396.     SortMainONFileSub( "F", 20, MES  );    /* フォーラムの会議室である */
  3397.     SortMainONFileSub( "L", 20, LIB  );    /* DLである */
  3398.     SortMainONFileSub( "H",  0, HP   );    /* Home Party である */
  3399.  
  3400.     /* ID収集ファイルである */
  3401. /*
  3402.     SortMainONFileSub( "I",  0, COLLECT_ID );
  3403. */
  3404.     SortMainONFileSub( "M",  0, MAIL );    /* 電子メールである */
  3405.     SortMainONFileSub( "N",  0, NEW  );    /* 「今週のお知らせ」 */
  3406.     SortMainONFileSub( "P",  0, PATIO);    /* PATIO である */
  3407.     free( idx );
  3408. }
  3409.  
  3410. /* s0 ~ s1 が 同じフォーラムの同じ会議室 */
  3411. static    void    SortMainONMemorySub1( int st0 )
  3412. {
  3413.     int        st;
  3414.  
  3415.     /* 同じ発言日時 発言番号のものは 削除する */
  3416.     for ( st = st0 ; st < HatsugenSu - 1 ; st++ ) {
  3417.         if (    idx2[st].SayNum  == idx2[st+1].SayNum
  3418.         &&        idx2[st].SayDate == idx2[st+1].SayDate
  3419.         )    idx2[st].SayNum = 0;
  3420.     };
  3421.     if (    treeMode == 1
  3422. /*
  3423.     ||        MesNum == MAIL
  3424.     ||        MesNum == LIB
  3425.     ||        MesNum == HP
  3426. */
  3427.     ) {
  3428.         /* 全てのコメント元番号を 0 にする */
  3429.         for ( st=st0; st<HatsugenSu; st++ )    idx2[st].ComNum = 0;
  3430.     } else {
  3431.         /* 最初の発言番号よりも小さなコメント元番号は 0 にする */
  3432.         sayNum = idx2[st0].SayNum;        idx2[st0].ComNum = 0;
  3433.         for ( st=st0+1; st<HatsugenSu; st++ ) {
  3434.             /* 1993.8.21 以下の判定を追加 */
  3435.             if ( idx2[st-1].SayNum > idx2[st].SayNum ) {
  3436.                 /* この発言番号が前の発言番号よりも小さい場合 */
  3437.                 /* sayNum を変更し idx2[st].ComNum を0にする */
  3438.                 sayNum = idx2[st].SayNum;
  3439.                 idx2[st].ComNum = 0;
  3440.             };
  3441.             if ( idx2[st].ComNum < sayNum ) idx2[st].ComNum = 0;
  3442.         };
  3443.     };
  3444.     CommentLevel = 0;    *sort1_line = '\0';        st = st0;
  3445.     while ( ( st= sort1(st) ) < HatsugenSu )    ;
  3446. }
  3447.  
  3448. void    SortMainONMemory()
  3449. {
  3450.     int        f0, m0;
  3451.     int        f1, m1;
  3452.  
  3453.     SortIdx2();
  3454.  
  3455.     /* 同じ発言日時 発言番号のものは 削除する */
  3456.     for ( f0 = 0 ; f0 < idx2P - 1 ; f0++ ) {
  3457.         if (    idx2[f0].SayNum  == idx2[f0+1].SayNum
  3458.         &&        idx2[f0].SayDate == idx2[f0+1].SayDate
  3459.         )    idx2[f0].SayNum = 0;
  3460.     };
  3461.     f0 = 0;
  3462.     while ( f0 < idx2P ) {
  3463.         /* 同じフォーラムについて処理する */
  3464.         sayNum = idx2[f0].ForumName;
  3465.         if ( ( MesNum = idx2[f0].MesNum ) > 20 ) {
  3466.             for ( f1=f0+1; f1<idx2P; f1++ ) {
  3467.                 if ( sayNum != idx2[f1].ForumName )    break;
  3468.                 if ( MesNum != idx2[f1].MesNum )    break;
  3469.             };
  3470.         } else {
  3471.             for ( f1=f0+1; f1<idx2P; f1++ ) {
  3472.                 if ( sayNum != idx2[f1].ForumName )    break;
  3473.             };
  3474.         };
  3475.         /* f0 ~ f1 が同一フォーラム */
  3476. /*
  3477.         printf( "%2d ~ %2d が同一フォーラムです\n", f0, f1-1 );
  3478. */
  3479.         strcpy( ForumName, idxs[idx2[f0].ForumName].name );
  3480.         newForumSw = FALSE;
  3481.         m0 = f0;
  3482.         while ( m0 < f1 ) {
  3483.             /* 同じ会議室番号について処理する */
  3484.             sayNum = idx2[m0].MesNum;
  3485.             for ( m1=m0+1; m1<f1; m1++ ) {
  3486.                 if ( sayNum != idx2[m1].MesNum )    break;
  3487.             };
  3488.             /* m0 ~ m1 が同一会議室 */
  3489. /*
  3490.             printf( "\t%2d ~ %2d が同一会議室です\n", m0, m1-1 );
  3491. */
  3492.             /* 広域変数の設定 */
  3493.             HatsugenSu = m1;    MesNum = idx2[m0].MesNum;
  3494.             newKaigishitsuSw = FALSE;
  3495.             if ( MesNum == LIB && newForumSw == FALSE ) newKaigishitsuSw =TRUE;
  3496.             SortMainONMemorySub1( m0 );
  3497.             m0 = m1;    /* m0 を進める */
  3498.         };
  3499.         f0 = f1;        /* f0 を進める */
  3500.     };
  3501. }
  3502.  
  3503. /* DIVIDE_END */
  3504.  
  3505. /* DIVIDE_START=sub.c */
  3506. /*
  3507.     GUI-CATLOG補助プログラム            sub.c
  3508.  
  3509.         1993.5.10
  3510.  
  3511.  このファイルでは、様々な補助関数を定義している。
  3512. */
  3513.  
  3514. #include    "ct.h"
  3515.  
  3516. static    int        isCLIPLine( void );
  3517. static    int        isBILLLine( void );
  3518.  
  3519. static    int        isBILL_Sw = FALSE;
  3520.  
  3521. int        isMesEnd( )
  3522. {
  3523.     char    *p1, *p2;
  3524.  
  3525.     if ( PSL < 5 )                                                return( NO );
  3526.     /* NIFTY の新形式 1993.7.4 追加 */
  3527.     /* 下の命令は <Nakatani> さんより教えていただいた */
  3528.     if    ( *(long *)PSP == 0x0a0d0820LU )                        return( YES );
  3529. /*
  3530.     if (    *PSP     == 0x20
  3531.     &&        *(PSP+1) == 0x08
  3532.     &&        *(PSP+2) == 0x0d
  3533.     &&        *(PSP+3) == 0x0a
  3534.     )                                                            return( YES );
  3535. */
  3536.  
  3537.     if (    MesNum == NEW
  3538.     ||        MesNum == CLIP
  3539.     ) {
  3540.         /* 1993.8.22 「今週のお知らせ」に対応。以下の2つの文字列を追加した */
  3541.         /* 「今週のお知らせ」の後は、以下の文字列だけを受け付ける           */
  3542.         if(matchstr("続き (改行で次文書 E:終了)",PSP)==TRUE)    return( YES );
  3543.         if(matchstr("表示終了",PSP)==TRUE)                        return( YES );
  3544.         if ( MesNum == CLIP ) {
  3545.             if ( isCLIPLine() == YES )                            return( YES );
  3546.         };
  3547.         return( NO );
  3548.     };
  3549.  
  3550.     if ( MesNum == BILL ) {
  3551.         if(matchstr("日毎情報 (改行で表示  E:終了)",PSP)==TRUE)    return( YES );
  3552.         if ( isCATLOGFileSw == TRUE ) {
  3553.             if ( NSP == NULL )                                    return( YES );
  3554.         };
  3555.         if ( isBILLLine() == NO )                                return( NO );
  3556.         if ( isBILL_Sw == FALSE ) {
  3557.             isBILL_Sw = TRUE;
  3558.             set_hatsugen_date( BILL, PSP, str );    /* 年月のみ設定 */
  3559.             sayNum=atoi( str );                        /* 年月 */
  3560.             sayDate = date_to_long( BILL, str );
  3561.             p1 = HyoudaiLine;    p2 = PSP;
  3562.             while ( *p1 )    p1++;
  3563.             /* 6文字コピー */
  3564.             *p1++ = *p2++;    *p1++ = *p2++;    *p1++ = *p2++;
  3565.             *p1++ = *p2++;    *p1++ = *p2++;    *p1++ = *p2++;
  3566.             *p1 = '\0';
  3567.         };
  3568.         sayDate += atol( PSP + 6 );
  3569.         return( NO );
  3570.     };
  3571.  
  3572.     if ( MesNum == LIB ) {
  3573.         /* isLIBMes */
  3574.         if ( isLIBLine() == NO ) {
  3575.             if (    matchstr( "番号 (改行で次頁)", PSP ) == TRUE
  3576.             &&        NSL == 4
  3577.             &&        matchstr( ">", NSP ) == TRUE
  3578.             )                                                return( NO );
  3579.             return( YES );
  3580.         };
  3581.         sayDate += atol( PSP + 32 );
  3582.         return( NO );
  3583.     };
  3584.  
  3585.     if ( isMesInputLine( PSP ) == YES )                            return( YES );
  3586.     /* - FTOWNS1 : フォーラム名  */
  3587.     if ( isMesForumNameLine_sub( PSP , PSL ) == YES )            return( YES );
  3588.     /* 発言の表題の行 */
  3589.     if ( isMesHyoudaiLine( PSP ) == YES )                        return( YES );
  3590.     if ( matchstr( "電子会議 (1:発言" , PSP ) == TRUE )            return( YES );
  3591.     if ( matchstr( "電子会議 (1:コメ" , PSP ) == TRUE )            return( YES );
  3592.     if ( matchstr( "電子会議 (改行の" , PSP ) == TRUE )            return( YES );
  3593.     if ( matchstr( ">◆次頁はありません◆",PSP ) == TRUE )        return( YES );
  3594.     if ( matchstr(   "◆次頁はありません◆",PSP ) == TRUE )        return( YES );
  3595.     if ( matchstr("*****log整理",PSP ) == TRUE )                return( YES );
  3596.     /* int    isMailEnd() */
  3597.     if ( isMAILFirstLine() == YES )                                return( YES );
  3598.     if ( matchstr( "受信後 (1:削除" ,PSP ) == TRUE )            return( YES );
  3599.     /* int    isPATIOEnd() */
  3600.     if ( isPATIOFirstLine() == YES )                            return( YES );
  3601.     if (    strncmp( PSP , "PATIO(" , 6 ) == 0
  3602.     &&        (    *( PSP + 6 ) == 'R'
  3603.             ||    *( PSP + 6 ) == 'N'
  3604.             ||    *( PSP + 6 ) == 'C'
  3605.             )
  3606.     &&        strncmp( PSP + 7 , ")>" , 2 ) == 0
  3607.     ) {
  3608.         /************************************************************/
  3609.         /* PATIO(?)> : end 条件に入れることは問題があるかもしれない */
  3610.         /************************************************************/
  3611.         if ( PSL == 11 )                                        return( YES );
  3612.         p1 = PSP + 9;
  3613.         if (    PSL > 15        /* 15 : "PATIO(R)>GO " + 3  +3:CrLf+1 */
  3614.         &&        (    strncmp( p1 , "GO " , 3 ) == 0
  3615.                 ||    strncmp( p1 , "go " , 3 ) == 0
  3616.                 )
  3617.         )                                                        return( YES );
  3618.         if (    PSL == 41    /*123456789 123456789 123456789 */
  3619.         &&        strncmp( p1 , "-これ以上の発言はありません-" , 30 ) == 0
  3620.         )                                                        return( YES );
  3621.     };
  3622.     /* int    isHPEnd() */
  3623.     if ( isHPFirstLine() == YES )                                return( YES );
  3624.     if ( matchstr( "HP>", PSP ) == TRUE ) {
  3625.         /******************************************************/
  3626.         /* HP> : end 条件に入れることは問題があるかもしれない */
  3627.         /******************************************************/
  3628.         if ( PSL == 5 )    /* 3 + 2 : +2 は cr lf の為 */            return( YES );
  3629.         p1 = PSP + 3;
  3630.         if (    PSL >= 8     /* 3 + 3 + 2 : "HP>MOV" cr lf で8バイト */
  3631.         &&        (    strncmp( p1 , "GO " , 3 ) == 0
  3632.                 ||    strncmp( p1 , "go " , 3 ) == 0
  3633.                 ||    strncmp( p1 , "MOV" , 3 ) == 0
  3634.                 )
  3635.         )                                                        return ( YES );
  3636.     };
  3637.  
  3638.     /* 1993.8.9 以下の2つの文字列を追加した */
  3639.     if ( matchstr("ID (改行のみ:自分のHP)",PSP) == TRUE )        return( YES );
  3640.     if ( matchstr("ID (改行のみ:自分のパティオ)",PSP)==TRUE)    return( YES );
  3641.     return( NO );
  3642. }
  3643.  
  3644. void    set_ForumNameLine( int mes )
  3645. {
  3646.     if ( *ForumName == '\0' )    strcpy( ForumName, "UNKNOWN" );
  3647.     switch( mes ) {
  3648.         case PATIO:
  3649.             sprintf(ForumNameLine,"PATIO:%s のPATIOです", ForumName );
  3650.             break;
  3651.         case HP:
  3652.             sprintf(ForumNameLine,"HP:%s のHPです", ForumName );
  3653.             break;
  3654.         case MAIL:
  3655.             sprintf(ForumNameLine,"MAIL:%s からのMAILです",ForumName );
  3656.             break;
  3657.         case LIB:
  3658.             sprintf(ForumNameLine,"LIB:%s のDLです",ForumName );
  3659.             break;
  3660.         case NEW:
  3661.             strcpy(ForumNameLine, "NEW: 今週のお知らせ " );
  3662.             break;
  3663.         case CLIP:
  3664.             strcpy(ForumNameLine, "CLIP: クリッピングサービス " );
  3665.             break;
  3666.         case BILL:
  3667.             strcpy(ForumNameLine, "BILL: 利用料金情報 " );
  3668.             break;
  3669.         default:
  3670.             sprintf(ForumNameLine,
  3671.                                   "FORUM or ID:%s 会議室番号=<%d>の発言です",
  3672.                     ForumName,
  3673.                     mes
  3674.             );
  3675.             break;
  3676.     };
  3677. }
  3678.  
  3679. void    present_str_copy( char *str )
  3680. {
  3681.     strncpy(str, PSP, PSL);        str[ PSL - 2 ]='\0';
  3682. };
  3683.  
  3684. int        matchstr( const char *form, const char *trg )
  3685. {
  3686.     while ( *form ) {
  3687.         switch( *form ) {
  3688.             case '%':    if ( ! isdigit( *trg ) )    return( FALSE );
  3689.                         break;
  3690.             case '$':    if ( ! isalpha( *trg ) )    return( FALSE );
  3691.             case '?':    break;
  3692.             default:    if ( *form != *trg )        return( FALSE );
  3693.         };
  3694.         form++;        trg++;
  3695.     };
  3696.     return( TRUE );
  3697. }
  3698.  
  3699. int        isIDname( char *str )
  3700. {
  3701.     if ( matchstr( "$$$%%%%%" , str ) == TRUE )        return( YES );
  3702.     return( NO );
  3703. }
  3704.  
  3705. static    int        isMesHyoudaiLine( char *str )
  3706. {
  3707.     /*               123456789 123456789 123456789 1234567 */
  3708.     if ( matchstr( "%%%/%%%   $$$%%%%%  ???????????????? ",str) == TRUE ) {
  3709.         return( YES );
  3710.     };
  3711.     /* SYSOP 削除 */
  3712.     if ( matchstr( "%%%/%%%   ********  ???????????????? ",str) == TRUE ) {
  3713.         return( YES );
  3714.     };
  3715.     /*              0123456789 123456789 123456789 123456789 123456789 */
  3716.     if ( matchstr( "%%%%%/%%%%% $$$%%%%%  ???????????????? ",str) == TRUE ) {
  3717.         return( YES );
  3718.     };
  3719.     /* SYSOP 削除 */
  3720.     if ( matchstr( "%%%%%/%%%%% ********  ???????????????? ",str) == TRUE ) {
  3721.         return( YES );
  3722.     };
  3723.     return( NO );
  3724. }
  3725.  
  3726. /***********************************************************************/
  3727. /*       会議室番号の行?                                              */
  3728. /*           1         2         3         4                           */
  3729. /*  123456789 123456789 123456789 1234567                              */
  3730. /* ( 1)   89/04/13 20:39  006へのコメント                              */
  3731. /* ( 1)   92/09/18 14:05                     コメント数:1             */
  3732. /* ( 2)   92/05/04 03:20                                               */
  3733. /***********************************************************************/
  3734. static    int        isMesSecondLine( char *str )
  3735. {
  3736.     if ( matchstr( "(?%)   %%/%%/%% %%:%%" , str ) == TRUE ) return( YES );
  3737.     if ( matchstr( "       %%/%%/%% %%:%%" , str ) == TRUE ) return( YES );
  3738.     return( NO );
  3739. }
  3740.  
  3741. /***********************************************************************/
  3742. /*                                                                     */
  3743. /*      フォーラム名の行?                                                  */
  3744. /*                                                                     */
  3745. /* - FTOWNS1  MES(18):通信ソフトについて(3) 92/04/25 -                */
  3746. /*                                                                     */
  3747. /***********************************************************************/
  3748. static    int        isMesForumNameLine_sub( char *str , int len )
  3749. {
  3750.     char    *p1;
  3751.  
  3752.     if ( len == 0 )        return( NO );
  3753.  
  3754.     /********************************************/
  3755.     /* F で始まらないフォーラムへも対応 92.7.17 */
  3756.     /********************************************/
  3757.     if ( strncmp( str,"- ",2) !=0 )    return( NO );
  3758.  
  3759.     p1 = str + 2;
  3760.  
  3761.     /* フォーラム名 : 英数字 ? */
  3762.     while ( isalnum( *p1 ) ) p1++;
  3763.  
  3764.     /* 2つの空白 */
  3765.     if ( *p1++ != ' ' )    return( NO );
  3766.     if ( *p1++ != ' ' )    return( NO );
  3767.  
  3768.     /* - FTOWNS1  MES( 3): */
  3769.     if ( strncmp( p1 , "MES(" , 4 ) != 0 )            return( NO );
  3770.     p1 += 4;
  3771.     if ( (! isdigit( *p1 ) ) && *p1 != ' ' )        return( NO );
  3772.     p1++;
  3773.     if ( ! isdigit( *p1 ) )                            return( NO );
  3774.     p1++;
  3775.     if ( *p1++ != ')' )                                return( NO );
  3776.     if ( *p1++ != ':' )                                return( NO );
  3777.  
  3778.     return( YES );
  3779. }
  3780.  
  3781. static    int        isMAILFirstLine()
  3782. {
  3783.     if ( PSL < 43 )                                    return( NO );
  3784.     if ( PSP[3] != ' ' && PSP[3] != '#' )            return( NO );
  3785.     if (matchstr("?% ?????????????????  $$$%%%%%  %%/%% %%:%%",PSP)!=TRUE
  3786.     &&    matchstr("?% ?????????????????  $$$%%%%%          %%/%%/%% %%:%%",PSP)
  3787.                 !=TRUE
  3788.     ) {
  3789.         return( NO );
  3790.     };
  3791.     if ( matchstr( "    題名:", NSP ) == TRUE )    return( YES );
  3792.     return( NO );
  3793. }
  3794.  
  3795. static    int        isPATIOFirstLine()
  3796. {
  3797.     if (    isMesHyoudaiLine( PSP ) == YES
  3798.     &&        *( PSP + 5 ) == '/'        /* 新形式の発言形式だけに */
  3799.     &&        isMesSecondLine( NSP ) == YES
  3800.     )                                        return( YES );
  3801.     return( NO );
  3802. }
  3803.  
  3804. static    int    isHPFirstLine()
  3805. {
  3806.     if ( PSL < 38 )                                        return( NO );
  3807.     if ( matchstr( "%%%  [%%/%%/%% %%:%%]  $$$%%%%%      " , PSP ) != TRUE ) {
  3808.         return( NO );
  3809.     };
  3810.     return( YES );
  3811. }
  3812.  
  3813. static    int        isMesInputLine( char *ptr )
  3814. {
  3815.     if(matchstr("?:お知らせ            ?:掲示板      ?:電子会議",ptr)==TRUE){
  3816.         return( YES );
  3817.     };
  3818.     return( NO );
  3819. }
  3820.  
  3821. int        isMAILMes( )
  3822. {
  3823.     if ( isMAILFirstLine() != YES )                return( FALSE );
  3824. /*
  3825. >0123456789 123456789 123456789 123456789 123456789 123456789
  3826. > 1 #山先              GHH01217  08/04 07:34
  3827. */
  3828.     strncpy( ForumName, PSP+22, 8 );    ForumName[ 8 ] = '\0';
  3829.     set_ForumNameLine( MAIL );
  3830.     MesNum = MAIL;        comNum = 0;
  3831.     StartMesSw = FALSE;            /* 以下は MES ではない */
  3832.     sayNum=atoi( PSP );
  3833.     set_hatsugen_date( MAIL, PSP, str );
  3834.     sayDate = date_to_long( MAIL, str );
  3835.     /* 題名のセット */
  3836.     set_hyoudaiName( MAIL );
  3837.     return( TRUE );
  3838. }
  3839.  
  3840. /****************************************************************************
  3841. >          1         2         3         4         5
  3842. > 123456789 123456789 123456789 123456789 123456789 123456789 123456789 1234
  3843. >番号  提供日付        題名
  3844. >  1    1/08 15:09 時: ◎CDROMで特許出願公開
  3845. >  2    1/08 12:01 時: ◎松下、米ベンチャー企業に出資
  3846. *****************************************************************************/
  3847. static    int        isBILLLine()
  3848. {
  3849.     if ( PSL < 24 )                                                return( NO );
  3850.     if ( matchstr( "%%/%% ?????% ?????????% ????????????????% ??????????????????% ????????????????%", PSP ) == FALSE )    return( NO );
  3851.     return( YES );
  3852. }
  3853.  
  3854. int        isBILLMes()
  3855. {
  3856.     char    *p1, *p2;
  3857.  
  3858.     if ( matchstr( "利用料金情報    BILL",PSP) == TRUE ) {
  3859.         MesNum = BILL;        set_ForumNameLine( BILL );
  3860.         strcpy( ForumName, "BILL" );
  3861.         return( FALSE );
  3862.     };
  3863.     if ( MesNum != BILL )                                    return( FALSE );
  3864.  
  3865.     if ( matchstr( " あなたの御利用状況は次のとおりです", PSP ) == TRUE ) {
  3866.         comNum = 0;
  3867.         isBILL_Sw = FALSE;
  3868.         /* 題名のセット */
  3869.         strcpy( HyoudaiLine, ForumNameLine );
  3870.         /* ここから表示するので TRUE で return する */
  3871.         return( TRUE );
  3872.     };
  3873.     return( FALSE );
  3874. }
  3875.  
  3876. /****************************************************************************
  3877. >          1         2         3         4         5
  3878. > 123456789 123456789 123456789 123456789 123456789 123456789 123456789 1234
  3879. >番号  提供日付        題名
  3880. >  1    1/08 15:09 時: ◎CDROMで特許出願公開
  3881. >  2    1/08 12:01 時: ◎松下、米ベンチャー企業に出資
  3882. *****************************************************************************/
  3883. static    int        isCLIPLine()
  3884. {
  3885.     if ( PSL < 24 )                                                return( NO );
  3886.     if ( matchstr( "??%   ?%/%% %%:%% ??: ?", PSP ) == FALSE )    return( NO );
  3887.     return( YES );
  3888. }
  3889.  
  3890. int        isCLIPMes()
  3891. {
  3892.     if ( matchstr( "クリッピングサービス    CLIP",PSP) == TRUE ) {
  3893.         MesNum = CLIP;
  3894.         strcpy( ForumName, "CLIP" );
  3895.         set_ForumNameLine( CLIP );
  3896.         return( FALSE );
  3897.     };
  3898.     if ( MesNum != CLIP )                                    return( FALSE );
  3899.  
  3900.     /*              123456789 123456789 123456789 123456 */
  3901.     if ( matchstr( "番号  提供日付        題名", PSP ) == TRUE ) {
  3902.         forever {
  3903.             GET_LINE2                            break;    /* 先読み */
  3904.             if ( strncmp( PSP, ">", 2)==0)        break;    /* 行頭の「>」で終了 */
  3905.             if ( atoi( PSP ) == 0 )                break;    /* 終了 */
  3906.         };
  3907.         return( FALSE );
  3908.     };
  3909.     if ( isCLIPLine() == NO )                                return( FALSE );
  3910.     sayNum=atoi( PSP );
  3911.     MesNum = CLIP;        comNum = 0;
  3912.     set_hatsugen_date( CLIP, PSP, str );
  3913.     sayDate = date_to_long( CLIP, str );
  3914.     /* 題名のセット */
  3915.     set_hyoudaiName( CLIP );
  3916.     return( TRUE );
  3917. }
  3918.  
  3919. int        isNEWFirstLine()
  3920. {
  3921.     if ( PSL < 38 )                                        return( NO );
  3922.                 /*   123456789 */
  3923.     if ( matchstr( "  ?%  %%/%%/%%    ?" , PSP ) != TRUE ) {
  3924.         return( NO );
  3925.     };
  3926.     return( YES );
  3927. }
  3928.  
  3929. static    char    NEWDate[ 10 ];
  3930.  
  3931. int        isNEWMes( )
  3932. {
  3933.     if ( matchstr( "今週のお知らせ    NEW", PSP ) == TRUE ) {
  3934.         *NEWDate = '\0';
  3935.         strcpy( ForumName, "NEW" );
  3936.         MesNum = NEW;
  3937.         StartMesSw = FALSE;            /* 以下は MES ではない */
  3938.         return( FALSE );
  3939.     };
  3940.     if ( MesNum != NEW )                        return( FALSE );
  3941.     if ( isNEWFirstLine() != YES )                return( FALSE );
  3942.     sayNum=atoi( PSP );
  3943.     MesNum = NEW;        comNum = 0;
  3944.     set_hatsugen_date( NEW, PSP, str );
  3945.     sayDate = date_to_long( NEW, str );
  3946.     /* 題名のセット */
  3947.     set_hyoudaiName( NEW );
  3948.     /* 最初の日付を入れておく */
  3949.     if ( *NEWDate == '\0' ) {        /* 8文字転送 */
  3950.         strncpy( NEWDate, PSP + 6, 8 );        NEWDate[ 8 ] = '\0';
  3951.     };
  3952.     set_ForumNameLine( NEW );    strcat( ForumNameLine, NEWDate );
  3953.     return( TRUE );
  3954. }
  3955.  
  3956. int        isHPMes( )
  3957. {
  3958.     if ( matchstr( "ID (改行のみ:自分のHP)", PSP ) == TRUE ) {
  3959.         GET_LINE2                                 return( FALSE );
  3960.         if ( strncmp( ":", PSP, 2 ) != 0 )        return( FALSE );
  3961.         strncpy( ForumName, PSP+2, 8 );    ForumName[ 8 ] = '\0';
  3962.         touppers( ForumName );
  3963.         set_ForumNameLine( HP );
  3964.         MesNum = HP;
  3965.         StartMesSw = FALSE;            /* 以下は MES ではない */
  3966.         return( FALSE );
  3967.     };
  3968.     if ( MesNum != HP )                            return( FALSE );
  3969.     if ( isHPFirstLine() != YES )                return( FALSE );
  3970.     sayNum=atoi( PSP );
  3971.     MesNum = HP;        comNum = 0;
  3972.     set_hatsugen_date( HP, PSP, str );
  3973.     sayDate = date_to_long( HP, str );
  3974.     /* 題名のセット */
  3975.     set_hyoudaiName( HP );
  3976.     return( TRUE );
  3977. }
  3978.  
  3979. int        isPATIOMes( )
  3980. {
  3981.     int        line;
  3982.  
  3983.     /* PATIO の入口から開設者の ID を取得する */
  3984.     if ( matchstr( "ID (改行のみ:自分のパティオ)", PSP ) == TRUE ) {
  3985.         GET_LINE2                                             return( FALSE );
  3986.         if ( strncmp( ":", PSP, 2 ) != 0 )                    return( FALSE );
  3987.         strncpy( ForumName, PSP+2, 8 );        ForumName[ 8 ] = '\0';
  3988.         touppers( ForumName );
  3989.         set_ForumNameLine( PATIO );
  3990.         StartMesSw = FALSE;            /* 以下は PATIO の発言であるという印 */
  3991.         MesNum = PATIO;
  3992.                                                             return( FALSE );
  3993.     };
  3994.  
  3995.     if ( MesNum != PATIO )                                    return( FALSE );
  3996.     /* フォーラムの会議室の発言と区別を付けるため */
  3997.     /* 以下の処理は StartMesSw が FALSE でないと処理しない */
  3998.     if ( StartMesSw == TRUE )                                return( FALSE );
  3999.  
  4000.     /*              123456789 123456789 123456789 123456 */
  4001.     if ( matchstr( "番号 発言 (未読)  最新  会議室名", PSP ) == TRUE ) {
  4002.         /* 会議室の一覧を KNL に入れる */
  4003.         /* 初期化 */
  4004.         for ( line=1; line<21; line++ ) *KNL[ line ] = '\0';
  4005.         forever {
  4006.             GET_LINE2                            break;    /* 先読み */
  4007.             if ( strncmp( PSP, ">", 2)==0)        break;    /* 行頭の「>」で終了 */
  4008.             line = atoi( PSP );
  4009.             if ( line == 0 )    break;    /* 終了 */
  4010.             if ( line > 20 )    break;    /* 終了 */
  4011.             strncpy( KNL[ line ], PSP, PSL);
  4012.             KNL[ line ][ PSL-2 ] = '\0';
  4013.         };
  4014.         return( FALSE );
  4015.     };
  4016.  
  4017.     if ( isPATIOFirstLine() != YES )            return( FALSE );
  4018.     sayNum=atoi( PSP );
  4019.     MesNum = PATIO;        comNum = 0;
  4020.     if ( NSL > 23 ) {
  4021.         comNum = atoi( NSP + 23 );
  4022.     };
  4023.     set_hatsugen_date( PATIO, NSP, str );
  4024.     sayDate = date_to_long( PATIO, str );
  4025.     /* 題名のセット */
  4026.     set_hyoudaiName( PATIO );
  4027.     return( TRUE );
  4028. }
  4029.  
  4030. /**********************************************/
  4031. /* フォーラムの入口からフォーラム名を取り出す */
  4032. /**********************************************/
  4033. static    int        get_forum_name_last_str( const char *ptr )
  4034. {
  4035.             int        sw;
  4036.     const    char    *p1;
  4037.             char    *p2;
  4038.  
  4039.     p1 = ptr;    sw = FALSE;
  4040.     while ( *p1 ) {
  4041.         if( *(long *)p1 == 0x20202020LU ) {
  4042.             sw = TRUE;    break;
  4043.         };
  4044.         p1++;
  4045.     };
  4046.     if ( sw == FALSE )        return( FALSE );
  4047.  
  4048.     p1 += 4;    p2 = ForumName;
  4049.     while ( isalnum( *p1 ) ) *p2++ = *p1++;
  4050.     *p2 = '\0';
  4051.     return( TRUE );
  4052. }
  4053.  
  4054. void    SaveTmpKaigishitsuNameLine( int typ )
  4055. {
  4056.     int        line;
  4057.     char    strS[ 40 ];
  4058.     FILE    *fp;
  4059.  
  4060.     /* 会議室の一覧を KNL に入れる */
  4061.     /* 初期化 */
  4062.     for ( line=1; line<21; line++ ) *KNL[ line ] = '\0';
  4063.     forever {
  4064.         GET_LINE2                            break;    /* 先読み */
  4065.         if ( strncmp( PSP, ">", 2)==0)        break;    /* 行頭の「>」で終了 */
  4066.         line = atoi( PSP );
  4067.         if ( line == 0 )    break;    /* 終了 */
  4068.         if ( line > 20 )    break;    /* 終了 */
  4069.         strncpy( KNL[ line ], PSP, PSL);
  4070.         KNL[ line ][ PSL-2 ] = '\0';
  4071.         if ( strncmp( NSP, ">", 2)==0)        break;    /* 行頭の「>」で終了 */
  4072.     };
  4073.  
  4074.     /* すでに登録済なら終了 */
  4075.     if ( typ == MES ) {            sprintf( strS, "FORUM:%s\n" , ForumName );
  4076.         set_tmp_file_name( KAIGISHITSU_TMP_FILE, FileName );
  4077.     } else if ( typ == LIB ) {    sprintf( strS, "LIB:%s\n"   , ForumName );
  4078.         set_tmp_file_name( DL_TMP_FILE, FileName );
  4079.     };
  4080.     if ( ( fp = fopen( FileName, "r") ) != NULL ) {
  4081.         while( fgets(str, LINE, fp) != NULL ) {
  4082.             if ( strcmp( str, strS ) == 0 ) {
  4083.                 fclose( fp );                                return;
  4084.             };
  4085.         };
  4086.         fclose( fp );
  4087.     };
  4088.  
  4089.     /* データをセーブする */
  4090.     if ( ( fp = fopen( FileName,"a") ) == NULL ) {
  4091.         er_open(FileName, 1, "SaveTmpKaigishitsuNameLine");
  4092.     };
  4093.     if ( typ == MES ) {            fprintf( fp, "FORUM:%s\n" , ForumName );
  4094.         set_tmp_file_name( KAIGISHITSU_TMP_FILE, FileName );
  4095.     } else if ( typ == LIB ) {    fprintf( fp, "LIB:%s\n"   , ForumName );
  4096.         set_tmp_file_name( DL_TMP_FILE, FileName );
  4097.     };
  4098.     fprintf( fp, "%s\n", ForumNameLine );
  4099.     if ( typ == MES ) {
  4100.             fprintf( fp, "番号 発言 (未読)  最新  会議室名\n" );
  4101.     } else if ( typ == LIB ) {
  4102.             fprintf( fp, "番号 総数 登録済 最新  ライブラリ名\n" );
  4103.     };
  4104.     for( line=1; line<=20; line++ ) {
  4105.         if ( *KNL[ line ] != '\0' ) {
  4106.             fprintf( fp , "%s\n" , KNL[ line ] );
  4107.         };
  4108.     };
  4109.     fprintf( fp, "\n" );
  4110.     fclose( fp );
  4111. }
  4112.  
  4113. /*
  4114. 00102/00107 GBH02001  座敷わらし       アフターダークはTOWNSで動かない?
  4115. (17)   93/08/21 15:40                     コメント数:2
  4116. 00103/00107 ACT12640  マシーン         RE:アフターダークはTOWNSで動かない?
  4117. (17)   93/08/21 18:57  00102へのコメント  コメント数:2
  4118. */
  4119.  
  4120. int        isFORUMMes( )
  4121. {
  4122.     int        line;
  4123.  
  4124.     if ( isMesInputLine( PSP ) == YES ) {
  4125.         if (strncmp(LSP,"<",2)==0) {
  4126.             if ( get_forum_name_last_str( LSP ) == TRUE ) {
  4127.                 strncpy( ForumNameLine, LSP, LSL);
  4128.                 ForumNameLine[ LSL-2 ] = '\0';
  4129.                 StartMesSw = TRUE;
  4130.             };
  4131.             return( FALSE );
  4132.         };
  4133.     };
  4134.  
  4135.     /* PATIO の発言と区別を付けるため */
  4136.     /* 以下の処理は StartMesSw が TRUE でないと処理しない */
  4137.     if ( StartMesSw != TRUE )                    return( FALSE );
  4138.  
  4139.     /*              123456789 123456789 123456789 123456 */
  4140.     if ( matchstr( "番号 発言 (未読)  最新  会議室名", PSP ) == TRUE ) {
  4141.         SaveTmpKaigishitsuNameLine( MES );
  4142.         return( FALSE );
  4143.     };
  4144.  
  4145.     if (    isMesHyoudaiLine( PSP ) != YES
  4146.     ||        isMesSecondLine( NSP ) != YES
  4147.     ) {
  4148.                                                 return( FALSE );
  4149.     };
  4150.     sayNum=atoi( PSP );
  4151.  
  4152.     MesNum = atoi( NSP + 1 );    comNum = 0;
  4153.  
  4154.     if ( NSL > 23 ) {
  4155.         comNum = atoi( NSP + 23 );
  4156.     };
  4157.     set_hatsugen_date( MES, NSP, str );
  4158.     sayDate = date_to_long( MES, str );
  4159.     /* 題名のセット */
  4160.     set_hyoudaiName( MES );
  4161. #if    VERIFY == YES
  4162.     if ( verify == TRUE ) {
  4163.         printf(    "isFORUMMes() で "
  4164.                 "会議室番号:%2d 発言番号:%5d コメント元番号:%5d\n"
  4165.                 "の発言を見つけました ↓ \n"
  4166.                 , MesNum, sayNum, comNum
  4167.         );
  4168.         present_str_print();
  4169.         next_str_print();
  4170.     };
  4171. #endif
  4172.     return( TRUE );
  4173. }
  4174.  
  4175. void    er_memory( const char *com )
  4176. {
  4177.     printf( "%s でメモリーが足りません。", com );
  4178.     exit( 1 );
  4179. }
  4180.  
  4181. void    er_open( const char *file, int mode, char *mes )
  4182. {
  4183.     char    str1[ MAX_FILENAME_LEN + 30 ];
  4184.  
  4185.     sprintf( str1, "%s で can't open→<%s> ", mes, file);
  4186.     switch( mode ) {
  4187.         case 0:    strcat( str1, "(read)" );    break;
  4188.         case 1:    strcat( str1, "(write)" );    break;
  4189.     };
  4190.     puts( str1 );        exit( 1 );
  4191. }
  4192.  
  4193. void    without_crlf( char *str )
  4194. {
  4195.     while ( *str ) {
  4196.         if ( *str == '\n' ) {    *str = '\0';    break;    };
  4197.         str++;
  4198.     };
  4199. }
  4200.  
  4201. const    char    *last_comma( const char *str )
  4202. {
  4203.     const    char    *result;
  4204.  
  4205.     result = str;
  4206.     while ( *str ) {    if ( *str == '.' ) result = str;
  4207.                         str++;
  4208.     };    return( result );
  4209. }
  4210.  
  4211. const    char    *last_yen( const char *str )
  4212. {
  4213.     const    char    *result;
  4214.  
  4215.     result = str;
  4216.     while ( *str ) {    if ( *str == '\\' ) result = str;
  4217.                         str++;
  4218.     };    return( result );
  4219. }
  4220.  
  4221. void    append_yen( char *str )
  4222. {
  4223.     char    c;
  4224.  
  4225.     if ( *str == '\0' )                    return;
  4226.  
  4227.     while ( *str )    str++;
  4228.     c = *( str -1 );
  4229.     if ( c != '\\' && c != ':' ) {
  4230.         *str++ = '\\';
  4231.         *str = '\0';
  4232.     };
  4233. }
  4234.  
  4235. char    *next_word( char *ptr )
  4236. {
  4237.     while ( ! isspace( *ptr ) )    ptr++;
  4238.     while (   isspace( *ptr ) && ( ! iskanji(*ptr) ) )    ptr++;
  4239.     return( ptr );
  4240. }
  4241.  
  4242. void    set_tmp_file_name( int num , char *FileName )
  4243. {
  4244.     if ( num == COMTREE_TMP_FILE ) {
  4245.         sprintf( FileName, "%scomtree.tmp", OutDir );
  4246.     } else if ( num == COMTXT_TMP_FILE ) {
  4247.         sprintf( FileName, "%scomtxt.tmp", OutDir );
  4248.     } else if ( num == KAIGISHITSU_TMP_FILE ) {
  4249.         sprintf( FileName, "%s会議室.tmp", OutDir );
  4250.     } else if ( num == DL_TMP_FILE ) {
  4251.         sprintf( FileName, "%sDL.tmp", OutDir );
  4252.     } else if ( num == COMTREE0_TMP_FILE ) {
  4253.         sprintf( FileName, "%scomtree0.tmp", OutDir );
  4254. #ifdef        MAKE_FAPXTREE_TMP
  4255.     } else if ( num == FAPXTREE_TMP_FILE ) {
  4256.         sprintf( FileName, "%sfapxtree.tmp", OutDir );
  4257. #endif
  4258.     } else {
  4259.         sprintf( FileName, "%s$ct%d.tmp", TmpDir, num );
  4260.     };
  4261. }
  4262.  
  4263. static    int        deleteTmpFileNum[] = {
  4264. #ifdef        MAKE_FAPXTREE_TMP
  4265.                     FAPXTREE_TMP_FILE,
  4266. #endif
  4267.                     KAIGISHITSU_TMP_FILE,
  4268.                     DL_TMP_FILE,
  4269.                     COMTXT_TMP_FILE,
  4270. /*
  4271.                     COMTREE_TMP_FILE,    
  4272.                     COMTREE0_TMP_FILE,
  4273. */
  4274.                     -1
  4275. };
  4276.  
  4277. void    deleteComTreeTmpFile()
  4278. {
  4279.     int        i, num;
  4280.  
  4281.     i = 0;
  4282.     while( ( num = deleteTmpFileNum[i] ) >= 0 ) {
  4283.         set_tmp_file_name( num, FileName );
  4284.         remove( FileName );
  4285.         i++;
  4286.     };
  4287. }
  4288.  
  4289. void    OpenComTreeTmpFile( char *Com )
  4290. {
  4291.     set_tmp_file_name( COMTREE0_TMP_FILE, FileName );
  4292.     if ( ( CT_fpo0= fopen(FileName,"w"))== NULL )    er_open(FileName, 1, Com);
  4293.  
  4294.     set_tmp_file_name( COMTREE_TMP_FILE, FileName );
  4295.     /* 下の "a" を "w" に変更したが……… 1993.9.6 */
  4296.     if ( (CT_fpo=fopen( FileName, "w") ) == NULL )    er_open(FileName, 1, Com);
  4297.  
  4298.     /* COMTXT_TMP_FILE に 発言の本体を書き出す */
  4299.     if ( NoTextSw == FALSE ) {            /* -t option */
  4300.         *FileNameSub = '\0';    CT_fpiText = NULL;
  4301.         set_tmp_file_name( COMTXT_TMP_FILE, FileName );
  4302.         if((CT_fpoText=fopen(FileName,"ab"))==NULL)    er_open(FileName, 1, Com);
  4303.     };
  4304. }
  4305.  
  4306. static    void    (*ct_findfirst_sub)( const char *file , const char *ff_name );
  4307.  
  4308. static    void    ct_findfirst_loop( const char *path )
  4309. {
  4310.             int        done;
  4311.     struct    ffblk    ffblk;
  4312.             char    f_name[ 256 ];
  4313.  
  4314.     strcpy( f_name , path );    strcat( f_name , "*.*" );    /* 全ファイルを検索 */
  4315.     done = findfirst( f_name , &ffblk , FA_DIREC );    /* Directory を指定 */
  4316.     while ( ! done ) {
  4317.         strcpy( f_name , path );    strcat( f_name , ffblk.ff_name );
  4318.         if ( ffblk.ff_attrib == FA_DIREC ) {
  4319.             if (    strcmp( ffblk.ff_name , "." ) != 0
  4320.             &&        strcmp( ffblk.ff_name , ".." ) != 0
  4321.             ) {    /* Sub dir 再帰呼出し */
  4322.                 /* 再帰的に検索しない? */
  4323.                 if ( NoSubDirSw == FALSE ) {
  4324.                     strcat( f_name , "\\" );    ct_findfirst_loop( f_name );
  4325.                 };
  4326.             };
  4327.         } else {
  4328.             /* ファイル名 */
  4329.             strcpy( ct_findfirst_path, path );
  4330.             (*ct_findfirst_sub)( f_name , ffblk.ff_name );
  4331.         };
  4332.         done = findnext( &ffblk );
  4333.     };
  4334. }
  4335.  
  4336. void    ct_findfirst(
  4337.     const char *path,
  4338.     void (*sub)( const char *file , const char *ff_name )
  4339. ) {
  4340.     ct_findfirst_sub = sub;
  4341.     ct_findfirst_loop( path );
  4342. }
  4343.  
  4344. char    *touppers( char *str0 )        /* 文字列を大文字に変換する */
  4345. {
  4346.     char    c , *str1 ;
  4347.  
  4348.     str1 = str0;
  4349.     while( ( c = *str1 ) != '\0' ) {
  4350.         if ( iskanji( c ) ) {    str1 += 2;                /* 漢字コード */
  4351.         } else {                *str1 = toupper( c );
  4352.                                 str1++;
  4353.         };
  4354.     };
  4355.     return( str0 );
  4356. }
  4357.  
  4358. /* 標題の部分を取り出す */
  4359. /*
  4360. >          1         2         3         4         5         6
  4361. > 123456789 123456789 123456789 123456789 123456789 123456789 123456789
  4362. >751  [93/07/24 04:39]  GHH01217      RE:CT 0.03L 送ります<山先
  4363. >336/338   PGA01332  -なる-(早川)      「実践 MopTerm マクロ講座」その(1)
  4364. >00978/00984 GEE00026  MID           白いワニ・・・
  4365. >04090/04309 MHG03611  那遊多           訂正(^_^;
  4366. > 1 #山先              GHH01217  08/04 07:34
  4367. >    題名:お願い
  4368. */
  4369. void    set_hyoudaiName( int typ )
  4370. {
  4371.     char    *p;
  4372.     char    *h_p,    *i_p;
  4373.     int        h_c,    i_c;
  4374.  
  4375.     switch( typ ) {
  4376.         case NEW:
  4377.             /*************************************************************
  4378.             > 123456789 123456789 123456789
  4379.             >   1  93/07/29    全国高校総体開幕、「高校総体情報」スタート
  4380.             **************************************************************/
  4381.             h_p = PSP +  6;    h_c = PSL -  6;
  4382.             i_p = PSP +  6;    i_c = 0;
  4383.         case CLIP:
  4384.             /*************************************************************
  4385.             >0123456789 123456789 123456789 123456789 123456789 123456789
  4386.             >  1    1/08 15:09 時: ◎CDROMで特許出願公開
  4387.             >  2    1/08 12:01 時: ◎松下、米ベンチャー企業に出資
  4388.             **************************************************************/
  4389.             h_p = PSP + 18;    h_c = PSL - 18;
  4390.             i_p = PSP + 18;    i_c = 0;
  4391.             break;
  4392.         case MAIL:
  4393.             /*
  4394.             >          1         2         3         4         5         6
  4395.             > 123456789 123456789 123456789 123456789 123456789 123456789 
  4396.             > 1 #山先              GHH01217  08/04 07:34
  4397.             >    題名:お願い
  4398.             */
  4399.             h_p = NSP + 10;    h_c = NSL - 10;
  4400.             i_p = PSP +  3;    i_c = 17;            /* 本名 or ハンドル */
  4401.             break;
  4402.         case HP:
  4403.             /*
  4404.             >          1         2         3         4         5         6
  4405.             > 123456789 123456789 123456789 123456789 123456789 123456789 
  4406.             >751  [93/07/24 04:39]  GHH01217      RE:CT 0.03L 送ります<山先
  4407.             */
  4408.             h_p = PSP + 37;    h_c = PSL - 37;
  4409.             i_p = PSP + 23;    i_c =  8;            /* ID */
  4410.             break;
  4411.         case MES :
  4412.             /*
  4413.             >          1         2         3         4         5         6
  4414.             > 123456789 123456789 123456789 123456789 123456789 123456789 
  4415.             >336/338   PGA01332  -なる-(早川)      「実践 MopTerm マクロ講座」その(1
  4416.             >00978/00984 GEE00026  MID           白いワニ・・・
  4417.             */
  4418.             if ( PSP[3] == '/' ) {
  4419.                 h_p = PSP + 38;    h_c = PSL - 38;
  4420.                 i_p = PSP + 20;    i_c = 16;            /* ハンドル */
  4421.             } else {
  4422.                 h_p = PSP + 39;    h_c = PSL - 39;
  4423.                 i_p = PSP + 22;    i_c = 16;            /* ハンドル */
  4424.             };
  4425.             break;
  4426.         case PATIO:
  4427.             /*
  4428.             >          1         2         3         4         5         6
  4429.             > 123456789 123456789 123456789 123456789 123456789 123456789 
  4430.             >04090/04309 MHG03611  那遊多           訂正(^_^;
  4431.             */
  4432.                 h_p = PSP + 39;    h_c = PSL - 39;
  4433.                 i_p = PSP + 21;    i_c = 16;            /* ハンドル */
  4434.             break;
  4435.         case BILL:
  4436.             h_p = PSP +  0;    h_c = PSL - 0;
  4437.             i_p = PSP +  0;    i_c = 0;                /* 無し */
  4438.             break;
  4439.         case LIB:
  4440.             /***************************************************************
  4441.             >          1         2         3         4         5
  4442.             >0123456789 123456789 123456789 123456789 123456789 123456789 1
  4443.             > 343  GHH01217 92/06/08   57903   19 B CATLOG06.EXE NIFTY通信
  4444.             ***************************************************************/
  4445.             h_p = PSP + 39;    h_c = PSL - 39;
  4446.             i_p = PSP +  6;    i_c = 8;                /* ID */
  4447.             break;
  4448.     };
  4449.     h_c -= 2;            /* cr lf を除く */
  4450.     p = HyoudaiLine;
  4451.     while ( i_c > 0 ) {        *p++ = *i_p++;        i_c--;    };
  4452.     *p++ = ' ';
  4453.     while ( h_c > 0 ) {        *p++ = *h_p++;        h_c--;    };
  4454.     *p = '\0';
  4455. }
  4456.  
  4457. void    set_hatsugen_date( int typ, const char *ptr, char *trg )
  4458. {
  4459.     int        i, cnt;
  4460.  
  4461.     switch( typ ) {
  4462.         case NEW:
  4463.             /*************************************************************
  4464.             > 123456789
  4465.             >   1  93/07/29    全国高校総体開幕、「高校総体情報」スタート
  4466.             **************************************************************/
  4467.             ptr += 6;    cnt = 3;    break;
  4468.         case CLIP:
  4469.             /*************************************************************
  4470.             > 123456789 123456789 123456789 123456789 123456789 123456789
  4471.             >  1    1/08 15:09 時: ◎CDROMで特許出願公開
  4472.             >  2    1/08 12:01 時: ◎松下、米ベンチャー企業に出資
  4473.             **************************************************************/
  4474.             ptr += 6;    cnt = 4;    break;
  4475.         case MAIL:
  4476.             /*           1         2         3         4                  */
  4477.             /*  123456789 123456789 123456789 123456789 12                */
  4478.             /*  1  山本 年秀     GHH01217  05/05 13:12                */
  4479.             /*  1 #山先              GHH01217          93/10/01 19:11     */
  4480.             if ( *(ptr+32) == ' ' ) {        ptr += 40;    cnt = 5;
  4481.             } else {                        ptr += 32;    cnt = 4;
  4482.             };
  4483.             break;
  4484.         case HP:
  4485.             /*           1         2         3         4                  */
  4486.             /*  123456789 123456789 123456789 123456789 123456789 1234567 */
  4487.             /* 001  [92/05/04 16:00]  GHH01217      オープンしました      */
  4488.             ptr += 6;    cnt = 5;    break;
  4489.         case MES :
  4490.             /*           1         2         3         4                  */
  4491.             /* 0123456789 123456789 123456789 123456789 1234567           */
  4492.             /* ( 1)   92/09/18 14:05                     コメント数:1    */
  4493.             /* ( 1)   92/09/18 14:16  00001へのコメント  コメント数:1    */
  4494.             ptr += 7;    cnt = 5;    break;
  4495.         case PATIO:
  4496.             /*           1         2         3         4                  */
  4497.             /* 0123456789 123456789 123456789 123456789 1234567           */
  4498.             /* ( 1)   93/07/04 14:12  08659へのコメント                   */
  4499.             ptr += 7;    cnt = 5;    break;
  4500.         case BILL:
  4501.                         cnt = 2;    break;
  4502.         case LIB:
  4503.             /***************************************************************
  4504.             >          1         2         3         4         5
  4505.             > 123456789 123456789 123456789 123456789 123456789 123456789 1
  4506.             > 343  GHH01217 92/06/08   57903   19 B CATLOG06.EXE NIFTY通信
  4507.             ***************************************************************/
  4508.             ptr += 15;    cnt = 3;    break;
  4509.     };
  4510.     for( i=0; i<cnt; i++ ) {
  4511.         *trg++ = *ptr++;        *trg++ = *ptr++;        ptr++;
  4512.     };
  4513.     *trg = '\0';
  4514. }
  4515.  
  4516. /********************************/
  4517. /* 日付情報を内部形式に変換する */
  4518. /********************************/
  4519. static    long    date_to_int_data[] = {
  4520.                 535680L,    /* 12L * 31L * 24L * 60L    年 */
  4521.                 44640L,        /* 31L * 24L * 60L             月 */
  4522.                 1440L,        /* 24L * 60L                 日 */
  4523.                 60L,        /*                            時 */
  4524.                 1L            /*                            分 */
  4525.     };
  4526.  
  4527. static    int     date_to_int_data_sub[] = {
  4528.                 1 ,        /* 年 */
  4529.                 1 ,        /* 月 */
  4530.                 1 ,        /* 日 */
  4531.                 0 ,        /* 時 */
  4532.                 0        /* 分 */
  4533.     };
  4534.  
  4535. long    date_to_long( int typ, char *date )
  4536. {
  4537.     long    d;
  4538.     int        i, s, e;
  4539.  
  4540.     d = 0;
  4541.     if ( typ == MAIL || typ == CLIP ) {
  4542.         /* 以下の判定は手抜きだ 1993.10.2 */
  4543.         if ( *date == '9' ) {                        s = 0;    e = 6;
  4544.         } else {                                    s = 1;    e = 5;
  4545.         };
  4546.     } else if ( typ == BILL ) {                        s = 0;    e = 2;
  4547.     } else if ( typ == LIB || typ == NEW ) {        s = 0;    e = 3;
  4548.     } else {                                        s = 0;    e = 5;
  4549.     };
  4550.     for ( i = s ; i < e ; i++ ) {
  4551.         d +=    (long)(
  4552.                     ( *date & 0x0f ) * 10 + ( *(date + 1 ) & 0x0f )
  4553.                     - date_to_int_data_sub[ i ]
  4554.                 ) * date_to_int_data[ i ];
  4555.         date += 2;
  4556.         if ( ! isdigit( *date ) )    break;
  4557.     };
  4558.     return( d );
  4559. }
  4560.  
  4561. void    long_to_date( int typ, char *date , long d )
  4562. {
  4563.     long    s;
  4564.     int        i;
  4565.     char    str1[ 24 ];
  4566.  
  4567.     if (    d < date_to_int_data[0]
  4568. /*    1993.10.2 コメントアウト
  4569.     ||        typ == MAIL
  4570. */
  4571.     ) {            s = 1;
  4572.     } else {    s = 0;
  4573.     };
  4574.     *date = '\0';
  4575.     for ( i = s ; i < 5 ; i++ ) {
  4576.         s = d / date_to_int_data[ i ] + (long)date_to_int_data_sub[ i ];
  4577.         d = d % date_to_int_data[ i ];
  4578.         sprintf( str1 , "%02ld" , s );        strcat( date , str1 );
  4579.     };
  4580. }
  4581.  
  4582. /* DIVIDE_END */
  4583.  
  4584. /* DIVIDE_START=ct.h */
  4585. /*
  4586.     コメントツリー作成プログラム                                ct.h
  4587.  
  4588.             作 : 山先(NIFTY-ID:GHH01217)
  4589. */
  4590.  
  4591. #include    <mylib.h>
  4592. #include    <stdlib.h>
  4593. #include    <ctype.h>
  4594. #include    <jctype.h>
  4595. #include    <string.h>
  4596. #include    <dos.h>
  4597. #include    <conio.h>
  4598. #include    <dir.h>
  4599. #include    "extern.h"
  4600.  
  4601. /********************************/
  4602. /* コメント関係の深さの最大値   */
  4603. /* * 2 は文字列として処理する為 */
  4604. /********************************/
  4605. #define        LEVEL_COMMENT    ( 35 * 2 )
  4606.  
  4607. #define        IDX_FILE_NAME        "CATLOG.IDX"    /* インデックス・ファイル */
  4608.  
  4609. #define        LINE                (1024*2)
  4610. #define        MAX_FILENAME_LEN    64
  4611. #define        MAX_BUFSIZE            (1024L*20L)
  4612.  
  4613. typedef        unsigned    SayLong;
  4614.  
  4615. #define        DELETE_SAY        (SayLong)0
  4616.  
  4617. /* CATLOG の会議室番号の定義 */
  4618. #define    MES            21            /* フォーラムの会議室である */
  4619. #define    FORUM_MES    22            /* フォーラムの会議室の一覧である */
  4620. #define    HP            23            /* Home Party である */
  4621. #define    MAIL        24            /* 電子メールである */
  4622. #define    BILL        25            /* 利用料金情報である */
  4623. #define    COLLECT_ID    26            /* ID収集ファイルである */
  4624. #define    LIB            27            /* LIB の一覧である */
  4625. #define    COLLECT_LIB    28            /* IDによる LIB の収集ファイルである */
  4626. #define    ALL_MAIL    29            /* 1つにまとめた MAIL ファイルである */
  4627. #define    PATIO        30            /* PATIO である */
  4628. #define    CLIP        31            /* クリッピングサービスである */
  4629. #define    NEW            32            /* 今週のお知らせである */
  4630.  
  4631. #define    COMTREE_TMP_FILE        999
  4632. #define    COMTREE0_TMP_FILE        998
  4633. #define    COMTXT_TMP_FILE            997
  4634. #define    KAIGISHITSU_TMP_FILE    996
  4635. #define    DL_TMP_FILE                995
  4636. #define    FAPXTREE_TMP_FILE        994
  4637.  
  4638. struct    IDX    {
  4639.             SayLong        SayNum;        /* 発言番号 */
  4640.             SayLong        ComNum;        /* コメント番号 */
  4641.             char        ahure;
  4642.             long        SayDate;    /* 発言日時 */
  4643.             long        seek;        /* tmp0 の seek 位置 */
  4644. };
  4645.  
  4646. #define        MAX_ATTR    31
  4647. #define        MAX_ATTR1    10
  4648.  
  4649. struct    IDX2    {
  4650.     int            ForumName;                /* ○ フォーラム名 */
  4651.     int            MesNum;                    /* 会議室番号 */
  4652.     int            ForumNameLine;            /* ○ フォーラム名の行 */
  4653.     int            KNL;                    /* ○ 会議室名の行 */
  4654.     int            FileName;                /* ○ ファイル名 */
  4655.     unsigned    SayNum;                    /* 発言番号 */
  4656.     unsigned    ComNum;                    /* コメント元番号 */
  4657.     long        SayDate;                /* 発言日時 */
  4658.     long        seek;                    /* seek 位置 byte */
  4659.     long        blen;                    /* 発言のサイズ byte */
  4660.     int            gyou;                    /* seek 位置 行 */
  4661.     int            glen;                    /* 発言のサイズ 行 */
  4662.     char        HyoudaiLine[ 61 ];        /* 題名 */
  4663.     char        ahure;
  4664. };
  4665.  
  4666. struct    IDXS    {
  4667.     char        name[ 80 ];
  4668. };
  4669.  
  4670. #ifdef    MAIN
  4671. #if    VERIFY == YES
  4672.             int        verify = FALSE;
  4673.             int        level_comment = LEVEL_COMMENT;
  4674. #endif
  4675.  
  4676.             struct    IDX2    *idx2 = NULL;
  4677.             struct    IDXS    *idxs = NULL;
  4678.             int        max_idx2 = 0;
  4679.             int        max_idxs = 0;
  4680.             int        idx2P = 0;
  4681.             int        idxsP = 0;
  4682.             int        OverIdxSw = FALSE;
  4683.  
  4684.             int        CommentLevel = 0;
  4685.             int        Display = TRUE;
  4686.             int        NoTextSw = FALSE;
  4687.  
  4688.             int        NoSubDirSw = FALSE;
  4689.             int        MaxFileSizeSw = FALSE;
  4690.             long    SearchFileSize = 0L;
  4691.             long    MaxSearchFileSize = 1024L*700L;
  4692.  
  4693.             char    FileName[ MAX_FILENAME_LEN ];
  4694.             char    FileNameSub[ MAX_FILENAME_LEN ];
  4695.             int        LineNumber;
  4696.             int        gyou;
  4697.             char    str[ LINE ];
  4698.  
  4699.             char    ForumName[ 20 ];
  4700.             char    OutDir[ MAX_FILENAME_LEN ], InputDir[ MAX_FILENAME_LEN ];
  4701.             char    TmpDir[ MAX_FILENAME_LEN ];
  4702.             int        MesNum ;
  4703.             SayLong        sayNum, comNum;
  4704.             long    sayDate;
  4705.  
  4706.             char    ForumNameLine[ 80 ];
  4707.             char    HyoudaiLine[ 84 ];
  4708.             char    KNL[ 21 ][ 82 ];
  4709.  
  4710.     struct    IDX        *idx = NULL;
  4711.             int        max_idx;
  4712.  
  4713.             int        treeMode = 0;
  4714.             int        isCATLOGFileSw = FALSE;
  4715.             int        StartMesSw = FALSE;
  4716.             int        LibNum = 0;
  4717.  
  4718.             int        doFrom1LOGFile;
  4719.             int        doOnlyCurrentCATLOGFile = FALSE;
  4720.  
  4721.             int        HatsugenSu;
  4722.             FILE    *CT_fpi, *CT_fpo, *CT_fpo0;
  4723.             FILE    *CT_fpoText = NULL;
  4724.             FILE    *CT_fpiText = NULL;
  4725.             char    ct_findfirst_path[ MAX_FILENAME_LEN ];
  4726.  
  4727.             char    *attr[ MAX_ATTR ] = {
  4728.                 "OBJ",    "EXE",    "EXP",    "LZH",    "BAT",    "LIB",    "SND",    "COM",
  4729.                 "PMB",    "PLP",    "PLT",    "REX",    "GGG",    "BAS",    "FMB",    "MML",
  4730.                 "ASM",    "C",    "H",    "LNK",    "GUR",    "GUS",    "DLL",    "ITM",
  4731.                 "MAP",    "NPB",    "BDF",    "ISH",    "O",    "A",    "TMP"
  4732.             };
  4733.             char    *attr1[ MAX_ATTR1 ] = {
  4734.                 "$A0",    "$B0",    "$C0",    "$H0",    "$I0",    "$L0",    "$L1",    "$M0",
  4735.                 "$P0",    "$N0"
  4736.             };
  4737.  
  4738. #else
  4739. #if    VERIFY == YES
  4740.     extern    int        verify ;
  4741.     extern    int        level_comment ;
  4742. #endif
  4743.  
  4744.     extern    char    *Version;        /* 本体は main.c にある */
  4745.  
  4746.     extern    struct    IDX2    *idx2;
  4747.     extern    struct    IDXS    *idxs;
  4748.     extern    int        max_idx2 ;
  4749.     extern    int        max_idxs ;
  4750.     extern    int        idx2P ;
  4751.     extern    int        idxsP ;
  4752.     extern    int        OverIdxSw ;
  4753.  
  4754.     extern    int        CommentLevel ;
  4755.     extern    int        Display ;
  4756.     extern    int        NoTextSw ;
  4757.  
  4758.     extern    int        NoSubDirSw ;
  4759.     extern    int        MaxFileSizeSw ;
  4760.     extern    long    SearchFileSize ;
  4761.     extern    long    MaxSearchFileSize ;
  4762.  
  4763.     extern    char    FileName[ MAX_FILENAME_LEN ];
  4764.     extern    char    FileNameSub[ MAX_FILENAME_LEN ];
  4765.     extern    int        LineNumber;
  4766.     extern    int        gyou;
  4767.     extern    char    str[ LINE ];
  4768.  
  4769.     extern    char    ForumName[ 20 ];
  4770.     extern    char    OutDir[ MAX_FILENAME_LEN ], InputDir[ MAX_FILENAME_LEN ];
  4771.     extern    char    TmpDir[ MAX_FILENAME_LEN ];
  4772.     extern    int        MesNum;
  4773.     extern    SayLong        sayNum, comNum;
  4774.     extern    long    sayDate;
  4775.  
  4776.     extern    char    ForumNameLine[ 80 ];
  4777.     extern    char    HyoudaiLine[ 84 ];
  4778.     extern    char    KNL[ 21 ][ 82 ];
  4779.  
  4780.     extern    struct    IDX        *idx;
  4781.     extern    int        max_idx;
  4782.  
  4783.     extern    int        treeMode ;
  4784.     extern    int        isCATLOGFileSw ;
  4785.     extern    int        StartMesSw ;
  4786.     extern    int        LibNum ;
  4787.  
  4788.     extern    int        doFrom1LOGFile;
  4789.     extern    int        doOnlyCurrentCATLOGFile ;
  4790.  
  4791.     extern    int        HatsugenSu;
  4792.     extern    FILE    *CT_fpi, *CT_fpo, *CT_fpo0;
  4793.     extern    FILE    *CT_fpoText ;
  4794.     extern    FILE    *CT_fpiText ;
  4795.     extern    char    ct_findfirst_path[ MAX_FILENAME_LEN ];
  4796.  
  4797.     extern    char    *attr[ MAX_ATTR ];
  4798.     extern    char    *attr1[ MAX_ATTR1 ];
  4799.  
  4800. #endif
  4801.  
  4802.     extern        char    *catlog_pool ;
  4803.     extern        char    *CPDS;
  4804.     extern        char    *LSP , *PSP , *NSP;
  4805.     extern        int        LSL , PSL , NSL;
  4806.     extern        long    pool_seek_ichi;    /* ファイルの中での位置 */
  4807.  
  4808. /* DIVIDE_END */
  4809.  
  4810. /* DIVIDE_START=extern.h */
  4811. /*
  4812.     GUI-CATLOG補助プログラム            extern.h
  4813.  
  4814.         1993.6.19
  4815.  
  4816.  このファイルでは、関数の定義をしている。
  4817. */
  4818.  
  4819. /*********/
  4820. /* lib.c */
  4821. /*********/
  4822. int        isLIBLine();
  4823. int        isLIBMes();
  4824.  
  4825. /***********/
  4826. /* check.c */
  4827. /***********/
  4828. void    SortIdx2();
  4829. void    OverIdx();
  4830. void    Check1File( const char *f_name , const char *ff_name );
  4831.  
  4832. /**********/
  4833. /* sort.c */
  4834. /**********/
  4835. void    sortNEW( const int st0 );
  4836. void    SortMainONFile( );
  4837. void    SortMainONMemory();
  4838.  
  4839. /*********/
  4840. /* sub.c */
  4841. /*********/
  4842. void    set_ForumNameLine( int mes );
  4843. int        matchstr( const char *form, const char *trg );
  4844. int        isIDname( char *str );
  4845. int        isHPMes( );
  4846. int        isMAILMes( );
  4847. int        isPATIOMes( );
  4848. void    SaveTmpKaigishitsuNameLine( int typ );
  4849. int        isFORUMMes( );
  4850. void    present_str_copy( char *str );
  4851. void    deleteComTreeTmpFile();
  4852. void    er_memory( const char *com );
  4853. void    er_open( const char *file, int mode, char *mes );
  4854. void    without_crlf( char *str );
  4855. const    char    *last_comma( const char *str );
  4856. const    char    *last_yen( const char *str );
  4857. void    append_yen( char *str );
  4858. char    *next_word( char *ptr );
  4859. void    set_tmp_file_name( int num , char *FileName );
  4860. void    ct_findfirst(                                                \
  4861.             const char *path,                                        \
  4862.             void (*sub)( const char *file , const char *ff_name )    \
  4863. );
  4864. char    *touppers( char *str0 );        /* 文字列を大文字に変換する */
  4865. void    set_hyoudaiName( int typ );
  4866. void    set_hatsugen_date( int typ, const char *ptr, char *trg );
  4867. long    date_to_long( int typ, char *date );
  4868. void    long_to_date( int typ, char *date , long d );
  4869.  
  4870. /**********/
  4871. /* file.c */
  4872. /**********/
  4873. char    *catlog_fgets();
  4874. int        initial_check_pool( const char *FileName );
  4875. void    end_check_pool();
  4876. long    catlog_fwrite( FILE *fpo );
  4877. void    catlog_fprintf( const char *targ , FILE *fpo );
  4878. void    CT_fcopy( FILE *fpi, long size, FILE *fpo);
  4879. long    GetFileSize( const char *FileName );
  4880. #if    VERIFY == YES
  4881. void    present_str_print();
  4882. void    next_str_print();
  4883. #endif
  4884. void    pool_malloc( );
  4885.  
  4886. /**********/
  4887. /* main.c */
  4888. /**********/
  4889. int        mallocIdx();
  4890.  
  4891. /**************/
  4892. /* マクロ定義 */
  4893. /**************/
  4894. #define    GET_LINE    if ( catlog_fgets( ) == NULL ) return
  4895. #define    GET_LINE2    if ( catlog_fgets( ) == NULL )
  4896.  
  4897. /* DIVIDE_END */
  4898.  
  4899. # DIVIDE_START=makefile
  4900. VER1        =    0
  4901. VER2        =    05
  4902. VER3        =    t            # 元のバージョン
  4903. VER4        =    0
  4904. VER5        =    05
  4905. VER6        =    u            # 現在のバージョン
  4906. MemoryModel    =    c
  4907. tc            =    tcc
  4908. lib            =    tlib
  4909. link        =    tlink
  4910. cflags        =    -m$(MemoryModel) -A -d -N -O -DVERSION="$(VER4).$(VER5)$(VER6)" -DVERIFY=NO
  4911.  
  4912. .c.obj    :
  4913.     $(tc)    -c $(cflags) -Ie:\tc\include $*
  4914.  
  4915. .c.com    :
  4916.     $(tc)    $(cflags) -Ie:\tc\include $*
  4917.     $(link)    /c \tc\lib\c0t.obj $*.obj , $* , nul , @listlibs
  4918.  
  4919. com_prg        =    ct.exe
  4920.  
  4921. hdr1        =    ct.h \tc\include\mylib.h
  4922. obj1        =    file.obj sub.obj check.obj sort.obj lib.obj load.obj
  4923.  
  4924. objV        =    main.obj
  4925.  
  4926. $(com_prg)    :    $(objV) $(obj1) makefile $(hdr1) all listobj
  4927.     tlink        @listobj
  4928.         copy    $(com_prg) d:\exe
  4929.     #    makebdf        $*    ct$(VER1)$(VER2) $(VER3) ct$(VER4)$(VER5) $(VER6)
  4930.     #    makebdf    -I    $*    ct$(VER1)$(VER2) $(VER3) ct$(VER4)$(VER5) $(VER6)
  4931.         makebdf    -BI    $*    ct$(VER1)$(VER2) $(VER3) ct$(VER4)$(VER5) $(VER6)
  4932.  
  4933. $(obj1)        : $(hdr1)
  4934. $(objV)        : $(hdr1) makefile        # Version 管理
  4935. # DIVIDE_END
  4936.  
  4937. # -DIVIDE_START=listobj
  4938. /c e:\tc\lib\c0c.obj main.obj file.obj sub.obj check.obj sort.obj lib.obj load.obj , ct.exe , nul , e:\tc\lib\emu e:\tc\lib\mathc e:\tc\lib\cc
  4939. # DIVIDE_END
  4940.  
  4941. REM -DIVIDE_START=m.bat
  4942. echo off
  4943. :loop
  4944.     if        "%1"==""    goto    main
  4945.     vz        %1
  4946. :loop2
  4947.     make
  4948.     if        errorlevel    1        goto    error
  4949.     goto    end
  4950. :main
  4951.     vz        all
  4952.     div        all
  4953.     goto    loop2
  4954. :error
  4955.     pause
  4956.     goto loop
  4957. :end
  4958. REM DIVIDE_END
  4959.  
  4960. REM -DIVIDE_START=u.bat
  4961.     div -u:update.doc all
  4962.     if errorlevel 1 goto end
  4963.     div -a:*.c all
  4964.     div -a:*.h all
  4965.     div -a:makefile all
  4966.     div -a:listlibs all
  4967.     div -a:*.bat all
  4968.     div -a:readme.doc all
  4969.     div -a:*.ggg all
  4970. :end
  4971. REM DIVIDE_END
  4972.  
  4973. /* -DIVIDE_START=ct.doc */
  4974.             ------------
  4975.                CTの使い方
  4976.             ------------
  4977.  
  4978. 1.CTがすること。
  4979.     本プログラムは、NIFTYのログを参照して、そのコメントツリーを
  4980.    表示する物です。
  4981.     1つの会議室で5040個までの発言についてツリーを作ることが出来
  4982.    ます。それ以上の発言は扱えませんので、生ログファイルを削除したり
  4983.    (危険!)、検索するディレクトリを少なくするようにして下さい。
  4984.     本来は、フォーラムの会議室の発言とPATIOの発言だけを処理すれ
  4985.    ば良いのですが、追加機能として以下の処理も行えるようにしました。
  4986.       ・HPの発言
  4987.       ・メール
  4988.       ・データライブラリー(以下DLと略す)のリスト
  4989.       ・今週のお知らせ
  4990.       ・クリッピングサービス
  4991.       ・NIFTYの課金情報
  4992.     ただし、これらの発言等は、発言日時、発言番号の順に並んだ物として表
  4993.    示されます。
  4994.     また、DLは、発言番号の位置にDL番号を表示し、DL番号の順に表示
  4995.    し、リストの参照数の和が異なれば異なる物として表示します。(参照数の
  4996.    和の多い方が後に表示されます。)
  4997.     また、課金情報は、発言番号の位置に、1番目の月を表示し、3ヵ月のア
  4998.    クセス回数の和が異なれば異なる物として表示します。(アクセス回数の和
  4999.    の多い方が後に表示されます。)
  5000.     処理の途中で「ESC」キーを押すと、処理を中断します。中断した時、内
  5001.    部で使用しているTMPファイル(後述)は削除しません。
  5002.  
  5003.  (1) 扱うファイル
  5004.    CTが理解できるファイルは、次のファイルです。
  5005.    ┌───────────────────────────┐
  5006.    │・FAPXを使ってオートでダウンした「生ログファイル」│
  5007.    │・CATLOGを使って「整理したファイル」      │
  5008.    └───────────────────────────┘
  5009.   これ以外のファイルは、フォーラム名や、HP・PATIOの設置者IDが
  5010.  「UNKNOWN」として処理されたり、PATIOがフォーラムとして処理される
  5011.  おそれがあります。
  5012.   また、全く発言を見つけることができないかも知れません。
  5013.  
  5014.  (2) 無視するファイル
  5015.    CTが無視するファイルは、明らかにログファイルではないと思われる拡
  5016.   張子のファイルです。
  5017.    コマンドライン上で、
  5018.      ct -z 
  5019.   と実行していただくと、無視するファイルの拡張子が表示されます。
  5020.  
  5021.    現在、次の拡張子が登録されています。( 41 個)
  5022.     OBJ     EXE     EXP     LZH     BAT     LIB     SND     COM
  5023.     PMB     PLP     PLT     REX     GGG     BAS     FMB     MML
  5024.     ASM     C       H       LNK     GUR     GUS     DLL     ITM
  5025.     MAP     NPB     BDF     ISH     O       A       TMP     $A0
  5026.     $B0     $C0     $H0     $I0     $L0     $L1     $M0     $P0
  5027.     $N0
  5028.  
  5029.    次の拡張子のファイルも無視されます。( 20 個)
  5030.     $F0 ~ $F9 , $FA ~ $FK
  5031.  
  5032.  (3) 作成するファイル
  5033.   CTを実行すると「出力ディレクトリ(OutDir)」(後述)に次のファイルを
  5034.  作成します。ファイルの内容については後述します。
  5035.  
  5036.   ・comtree.tmp   コメントツリーの諸データが書き込まれます。
  5037.    ・comtree0.tmp  コメントツリーの標題が書き込まれます。
  5038.    ・comtxt.tmp   発言の本体が書き込まれます。
  5039.    ・会議室.tmp   フォーラムの会議室の一覧が書き込まれます。
  5040.    ・DL.tmp    DLの一覧が書き込まれます。
  5041.  
  5042.   また、実行時、次のファイルをMS-DOSの環境変数「tmp」に設定され
  5043.  たディレクトリ(環境変数「tmp」が設定されていない場合はカレント・ディ
  5044.  レクトリ)に作成します。
  5045.   (実行後、削除されます。)
  5046.  
  5047.   ・$ct1.tmp  ~ $ct20.tmp
  5048.   ・xxxxxxxx.$H0  HP処理用の内部データです。
  5049.    ・xxxxxxxx.$P0  PATIO処理用の内部データです。
  5050.    ・xxxxxxxx.$F0 ┐
  5051.               ↓  │
  5052.     xxxxxxxx.$F9  │フォーラムの会議室処理用の内部データです。
  5053.     xxxxxxxx.$FA  │
  5054.               ↓  │
  5055.     xxxxxxxx.$FK ┘
  5056.    ・xxxxxxxx.$M0  メール発信者の内部データです。
  5057.    ・xxxxxxxx.$L0  DLの内部データです。
  5058.    ・CLIP.$C0    クリッピングサービスの内部データです。
  5059.    ・BILL.$B0    課金情報の内部データです。
  5060.    ・NEW.$N0    「今週のお知らせ」の内部データです。
  5061.  
  5062.      「xxxxxxxx」の部分には、フォーラム名、HP・PATIOの設定者のI
  5063.   D番号、メール発信者のID番号が入ります。
  5064.  
  5065.   なお、CTが起動された場合、上のTMPファイルがあれば全部削除します
  5066.  ので、同じ名前のファイルが無いことを充分ご確認の上、CTを実行して下さ
  5067.  い(削除して良いかどうかの確認はしません)。同名のファイルはないと思い
  5068.  ますが………。
  5069.  
  5070.   出力するファイルはいずれもテキストファイルです。(エディタ等で見るこ
  5071.  とができます)
  5072.  
  5073.  (4) MS-DOSの環境変数の参照
  5074.   CTは、次の2つの環境変数を参照しています。
  5075.       ctusr
  5076.       tmp
  5077.    「ctusr」は、CTに対してオプションスイッチを設定する働きがあります。
  5078.   スイッチの意味はコマンドラインで指定するスイッチと全く同じです。
  5079.    ただし、スイッチの優先順序があります。
  5080.    優先順位が一番高いのはコマンドラインからの指定です。ここで、指定す
  5081.   ると環境変数で指定していても無視されます。
  5082.    優先順位が次に高いのは、環境変数「ctusr」での指定です。これは、CT
  5083.   のデフォルトの値を無視します。
  5084.    優先順位が最も低いのは、CTのデフォルトの値です。
  5085.  
  5086.    「tmp」は、CTが内部で作成するTMPファイルを書き出すドライブ:デ
  5087.   ィレクトリを指定します。この設定がない場合はCTを起動した時のカレント
  5088.   ディレクトリにTMPファイルが書き出されます。
  5089.     「tmp」をRAMディスクに設定しておくと処理が高速になります。
  5090.  
  5091.  
  5092. 2.CTの実行の仕方
  5093.   コマンドライン上で、次のように実行して下さい。
  5094.     ct [-option] [-o OutDir名] InputDir名 [InputDir名] [InputDir名]...
  5095.  または、
  5096.      ct [-option] [-o OutDir名] File名 [File名] [File名]...
  5097.  または、
  5098.      ct [-option] @Def-File名
  5099.  
  5100.   オプションには必ず「-」を使って下さい。
  5101.   「-」の後ろには複数のオプションを指定することができます。
  5102.     例: -TDo
  5103.   また、別々に指定することもできます。
  5104.     例: -T -D -o
  5105.   また、矛盾する指定を同時に指定した場合は、後で(右側で)指定した方が
  5106.  有効になります。
  5107.     例: -Todt
  5108.       この場合「t」が有効になります。
  5109.   「-」の無いものは入力するファイル名かディレクトリ名として判断します。
  5110.   ということは、逆に、「-」から始まるファイルやディレクトリは入力として
  5111.  扱えないということです。適当な名前に変更(rename)してCTを起動して下
  5112.  さい。
  5113.  
  5114.   「-o OutDir名」の指定が無い場合は、「comtree.tmp」「comtree0.tmp」
  5115.  「会議室.tmp」「DL.tmp」ファイルはカレント・ディレクトリに書き出されま
  5116.  す。
  5117.  
  5118.    オプションは、次のものが指定できます。
  5119.  
  5120.    第1群 (ファイルの検索指定)
  5121.     -A ・・・・・・・   CATLOGのカレント・ファイル(拡張子0)のみ検索する
  5122.     -a ・・・・・・・ * CATLOGの全ての整理ファイルを検索する
  5123.        CATLOGは、会議室が新しくオープンされた場合とか、ファ
  5124.       イルの大きさが大きくなった場合等に、それまで書き出していたフ
  5125.       ァイルの名前を変更して、新しいファイルを作り、そのファイルに
  5126.       見つけた発言を追加していきます。そのファイル名はいつも同じで、
  5127.       フォーラムの会議室の場合「MESxx_00.TXT」となり、HomePa
  5128.       rtyの場合は「HP開設者ID.HP0」、PATIOの場合「PA
  5129.       TIO開設者ID.PA0」、メールの場合「メール発信者ID.ML0」
  5130.       となります。(CATLOGでは、このファイルをカレント・ファ
  5131.       イルと名付けています)
  5132.        そして、整理して出来上がったファイルに対してコメントツリー
  5133.       を作る場合、通常は(デフォルト)古いファイルに対してもコメン
  5134.       トツリーを作ろうとしますが、このスイッチを指定することにより、
  5135.       検索の対象をカレント・ファイルだけに絞ることができます。(処
  5136.       理時間が短くなるということです)。
  5137.  
  5138.     -F数 ・・・・・   数Kバイトまでファイルを検索する
  5139.     -f ・・・・・・・ * サイズで中断しない
  5140.        これは、発言が入っているかも知れないファイルを読み込むのに、
  5141.       「数」で指定した以上のサイズ(合計値)のファイルは読み込まな
  5142.       い、というスイッチです。
  5143.        例: -F1024
  5144.         この場合、読み込むファイルが 1024 × 1024 バイトを超える
  5145.        と、以後の指定のファイルは無視されます。
  5146.  
  5147.     -R ・・・・・・・   サブディレクトリのファイルを検索しない
  5148.     -r ・・・・・・・ * サブディレクトリのファイルを検索する
  5149.  
  5150.    第2群 (出力ディレクトリの指定)
  5151.     -o ・・・・・・・   「comtree.tmp」「comtree0.tmp」「会議室.tmp」の出力先の
  5152.           指定
  5153.        入力するファイルやディレクトリの、指定よりも先に指定して下さい。
  5154.        そうしないと「会議室.tmp」というファイルがカレント・ディレクト
  5155.       リに作られてしまいます。
  5156.  
  5157.    第3群 (高速化のための処理の指定)
  5158.     -D ・・・・・・・   標題等を画面上に表示しない
  5159.     -d ・・・・・・・ * 標題等を画面上に表示する
  5160.  
  5161.     -T ・・・・・・・   発言の本体(comtxt.tmp)を出力しない
  5162.     -t ・・・・・・・ * 発言の本体(comtxt.tmp)を出力する
  5163.  
  5164.    第4群 (ツリーの作り方の指定)
  5165.     -1 ・・・・・・・   ベタのまま、発言の標題を表示する
  5166.     -2 ・・・・・・・ * コメントツリーで発言の標題を表示する
  5167.  
  5168.    第5群 (設定ファイルの読み込み指定)
  5169.     @  ・・・・・・・   コマンド・ラインに記述しきれない場合や同一の処理を
  5170.            繰り返し行う場合に、コマンド・ラインに記述する書式
  5171.            で指定します。
  5172.  
  5173.    第6群 (補助的な指定)
  5174.     -z ・・・・・・・   読み飛ばす拡張子を表示する( 40 個 )
  5175.            実行後、終了します。
  5176.  
  5177.   ★ 「*」 は、デフォルトの設定です
  5178.  
  5179.  
  5180. 3.「入力ディレクトリ(InputDir)」「出力ディレクトリ(OutDir)」について
  5181.  (1) 入力ディレクトリ(InputDir)
  5182.   ログ・ファイルがどのドライブ:ディレクトリにあるのか指定します。
  5183.   指定の仕方はMS-DOSの方法です。
  5184.   カレント・ディレクトリのファイルを検索するのであれば「.」を指定します。
  5185.   この部分にファイル名を指定すると、指定したファイルだけを読み込んで発
  5186.  言を探索します。
  5187.   MS-DOSのワイルド・カードが使用できます。
  5188.   設定を省略することはできません。
  5189.   ディレクトリ名の最後に「\ 」を付ける必要はありません。
  5190.  
  5191.  (2) 出力ディレクトリ(OutDir)
  5192.   CTが作るファイルをどのドライブ:ディレクトリに書き出すかを指定しま
  5193.  す。
  5194.   指定の仕方はMS-DOSの方法です。
  5195.   この指定は省略することができます。省略されると、起動時のカレント・デ
  5196.  ィレクトリにファイルを書き出します。
  5197.    ディレクトリ名の最後に「\ 」を付ける必要はありません。
  5198.    この部分にRAMディスクを指定すると、少し高速になります。
  5199.  
  5200.  
  5201. 4.CTが作るファイルについて。
  5202.  (1) comtree.tmp   コメントツリーの諸データが書き込まれます。
  5203.   このデータは、3行が1セットになって、3行で1つの発言についてのデー
  5204.  タを表します。
  5205.   そして、「comtree0.tmp」に書き出される標題だけのデータや、「comtxt.t
  5206.  mp」に書き出される発言の本体と、同じ順番で書き出されています。
  5207.    その内容は次のようになっています。
  5208.  
  5209.    1行目はフォーラム名の行(NIFTYの形式)が入ります。
  5210.      以後フォーラム名が変わる場合は、「フォーラム名変更」という文字列
  5211.    が入ります。会議室番号は入りません。
  5212.     以後会議室番号が変わる場合は、「会議室名変更」という文字列が入り
  5213.    ます。会議室番号は入りません。
  5214.  
  5215.    2行目は、発言に関するデータが入ります。その意味は下の通りです。
  5216.        "%5ld %5ld %8ld %8ld %5d %5d %10ld\n"
  5217.         | |  | |  | | ↓
  5218.         | |  | |  | ↓ 発言日時(10文字の数字)
  5219.         | |  | |  ↓ 発言の終了行(5文字の数字)
  5220.         | |  | ↓  発言の開始行(5文字の数字)
  5221.         | |  ↓ 発言の終了バイト数(8文字の数字)
  5222.         | ↓  発言の開始バイト数(8文字の数字)
  5223.         ↓ コメント元番号(5文字の数字)
  5224.         発言番号(5文字の数字)
  5225.       「フォーラム名変更」「会議室名変更」の場合は、それぞれ該当の名前
  5226.     が入ります。
  5227.  
  5228.    3行目は発言のあったファイル名がパス名付きで書き出されます。
  5229.       「フォーラム名変更」「会議室名変更」の場合は、改行だけです。
  5230.  
  5231.  (2) comtree0.tmp  コメントツリーの標題が書き込まれます。
  5232.   内容は、画面上に表示される文字列をそのままファイルに書き込んだ物です。
  5233.   発言のツリーだけを表示すると、どのフォーラムのどの会議室の発言か分か
  5234.  りにくいので、それらがわかるデータ(標題)を入れてあります。
  5235.  
  5236.  (3) comtxt.tmp   発言の本体が書き込まれます。
  5237.    各発言の行頭には次の行が入っています。これらの文字列を検索することに
  5238.  より、エディタ等を使って発言を読むことができます。
  5239.    HPの場合      *****log整理(HP:xxxxxxxx          ) ファイル名 *****
  5240.    PATIOの場合   *****log整理(PATIO:xxxxxxxx       ) ファイル名 *****
  5241.    メールの場合     *****log整理(MAIL:xxxxxxxx        ) ファイル名 *****
  5242.    DLの場合      *****log整理(FORUM:xxxxxxxx LIB:xx) ファイル名 *****
  5243.    フォーラムの場合   *****log整理(FORUM:xxxxxxxx MES:xx) ファイル名 *****
  5244.    今週のお知らせの場合 *****log整理(今週のお知らせ       ) ファイル名 *****
  5245.    クリッピングサービス の場合 *****log整理(クリッピングサービス ) ファイル名 *****
  5246.    課金情報の場合    *****log整理(利用料金情報         ) ファイル名 *****
  5247.   「xxxxxxxx」の部分は8文字で、左詰めです。
  5248.   「xx」の部分は2文字で、右詰めです。
  5249.  
  5250.  (4) 会議室.tmp   フォーラムの会議室の一覧が書き込まれます。
  5251.   フォーラムの会議室の一覧が書き込まれます。
  5252.   形式は、次のようになっています。
  5253.    ┌──────────────────────────┐
  5254.    │FORUM:xxxxxx                    │
  5255.    │<FMフォーラム????館) >    xxxxxx       │
  5256.    │番号 発言 (未読)  最新  会議室名        │
  5257.    │ 1       1 (   1)   08/21   FAPXの部屋              │
  5258.    └──────────────────────────┘
  5259.   フォーラムとフォーラムの間には1行の空行があります。
  5260.   また、会議室の一覧に当たる文字列がなかった場合、このファイルは作成さ
  5261.  れません。
  5262.  
  5263.  (5) DL.tmp    DLの一覧が書き込まれます。
  5264.   DLの一覧が書き込まれます。
  5265.   形式は、次のようになっています。
  5266.    ┌──────────────────────────┐
  5267.    │LIB:xxxxxx                      │
  5268.    │<FMフォーラム????館) >    xxxxxx       │
  5269.    │番号 総数 登録済 最新  ライブラリ名            │
  5270.    │   1     1  (   1)  08/21   FAPX関連                │
  5271.    └──────────────────────────┘
  5272.   フォーラムとフォーラムの間には1行の空行があります。
  5273.   また、DLの一覧に当たる文字列がなかった場合、このファイルは作成さ
  5274.  れません。
  5275.  
  5276.   (6) TMPファイルについて
  5277.   実行時、次のファイルをMS-DOSの環境変数「tmp」に設定されたディレ
  5278.  クトリ(環境変数「tmp」が設定されていない場合はカレント・ディレクトリ)
  5279.  に作成します。(実行後、削除されます。)
  5280.  
  5281.   ・$ct1.tmp  ~ $ct20.tmp
  5282.   ・xxxxxxxx.$H0  HP処理用の内部データです。
  5283.    ・xxxxxxxx.$P0  PATIO処理用の内部データです。
  5284.    ・xxxxxxxx.$F0 ┐
  5285.               ↓  │
  5286.     xxxxxxxx.$F9  │フォーラムの会議室処理用の内部データです。
  5287.     xxxxxxxx.$FA  │
  5288.               ↓  │
  5289.     xxxxxxxx.$FK ┘
  5290.    ・xxxxxxxx.$M0  メール発信者の内部データです。
  5291.    ・xxxxxxxx.$L0  DLの内部データです。
  5292.    ・CLIP.$C0    クリッピングサービスの内部データです。
  5293.    ・BILL.$B0    課金情報の内部データです。
  5294.    ・NEW.$N0    「今週のお知らせ」の内部データです。
  5295.  
  5296.      「xxxxxxxx」の部分には、フォーラム名、HP・PATIOの設定者のI
  5297.   D番号、メール発信者のID番号が入ります。
  5298.  
  5299.   ファイルの内容は、1つの発言について6行で記述しています。
  5300.   1行目:フォーラム名と会議室番号が入ります。
  5301.       フォーラム名は8バイトで会議室番号との間には空白があります。
  5302.   2行目:フォーラム名の行が入ります。次のような行です。
  5303.       <FMTOWNS フォーラム 1 (基本編) >    FTOWNS1
  5304.   3行目:会議室番号の行が入ります。会議室の一覧から得ています。
  5305.      16     470 (   5)   08/15   MOPTERM と 仲間たち     【Q&A/交換】
  5306.   4行目:発言があったファイル名が入ります。
  5307.   5行目:発言に関するデータが入ります。「comtree.tmp」と同じ書式です。
  5308.   6行目:発言者のハンドル(ID)と発言の題名が入ります。
  5309.  
  5310.   なお、CTが起動された場合、上のTMPファイルがあれば全部削除します
  5311.  ので、カレント・ディレクトリやMS-DOSの環境変数「tmp」で指定したデ
  5312.  ィレクトリに、同じ名前のファイルが無いことを充分ご確認の上、CTを実行
  5313.  して下さい(削除して良いかどうかの確認はしません)。同名のファイルはな
  5314.  いと思いますが………。
  5315.  
  5316.   また、CTを実行している間に「ESC」キーを押すと、処理が中断されます。
  5317.  この時、上記のTMPファイルはそのままディレクトリに残ってしまいます。
  5318.  
  5319.  
  5320. 5.実行例
  5321.  (1) 実行例1
  5322.   「f:\log」にあるファイルを検索してツリーを作る。
  5323.   できたファイルは「f:\tmp」に書き出す。
  5324.   「comtxt.tmp」を作る。
  5325.      ct -o f:\tmp f:\log
  5326.  
  5327.  (2) 実行例2
  5328.   「f:\log」にあるファイルを検索して、ツリーを作る。
  5329.   できたファイルはカレント・ディレクトリに書き出す。
  5330.   ただし、「comtxt.tmp」ファイルは作らない。
  5331.      ct -T f:\log
  5332.   例1と異なる所はオプション指定を付加していることです。
  5333.  
  5334.  (3) 実行例3
  5335.   「f:\log\ffmhob 」にあるファイルを検索して、ツリーを作る。
  5336.   できたファイルは「f:\tmp」に書き出す。
  5337.   「comtxt.tmp」ファイルは作らない。
  5338.      ct -o f:\tmp -DT f:\log\ffmhob
  5339.  
  5340.  (4) 実行例4 → できるだけ高速に処理を行う。
  5341.   MS-DOSの環境変数「tmp」にRAMディスクを指定する。
  5342.      例えば、「G:」ドライブがRAMディスクだったとすると、システム
  5343.     起動時に最初に実行する「autoexec.bat」というバッチファイルに
  5344.       set tmp=g:
  5345.     という1行を追加しておくと設定できます。
  5346.   「-D」オプションを指定する。
  5347.    「-T」オプションを指定する。
  5348.  
  5349.    使い方はだいたい分かっていただいたでしょうか?
  5350.  
  5351.  
  5352. 6.問題点
  5353.  (1) とにかく、処理に時間がかかるということです。
  5354.    CATLOGで整理したファイルに対して処理を行うと、数分~数十分も
  5355.   待たされます。どうするかが今後の問題です。
  5356.  
  5357.  (2) かなりたくさんのTMPファイルを作ります。
  5358.    1つの会議室につき、1ファイルを作ります。10のフォーラムで10の
  5359.   会議室の発言があると100個のTMPファイルができます。
  5360.  
  5361.  (3) 「-T」オプションを指定しない場合、「comtxt.tmp」というファイルを書
  5362.   き出す為、発言と同じ大きさのファイルができてしまうということです。
  5363.    (それ以外のファイルはそれ程大きくはないんですが)
  5364.  
  5365.  (4) ファイルに書き出す際、ちゃんと書き出されたかどうかのチェックは行っ
  5366.   ていません(はっきり言って手抜きです)。できるだけ残り容量の大きいド
  5367.   ライブに環境変数「tmp」や「出力ディレクトリ(OutDir)」を指定して欲し
  5368.   いと思います。
  5369.  
  5370.  (5) 実行時、メモリーのヒープ領域を大量に確保します。充分なメモリーが無
  5371.   い場合は処理できる発言数が少なくなるばかりか、「発言の数が多くて処理
  5372.   できません」というエラーメッセージを出して中断することもあります。
  5373.  
  5374.  
  5375. 7.作成協力者
  5376.  以下の方々にご協力いただいて、本プログラムは作られました。
  5377.  ここに紹介して感謝の念を表したいと思います。
  5378.  
  5379.     PEE01244  Yama-chan     さん
  5380.     PFG02442  <Nakatani>   さん
  5381.    QFH02666 『コノミ』   さん
  5382.      GFF00430  えんでん    さん
  5383.      VFA03257  フェイス    さん
  5384.      PED00201  JINX    さん
  5385.      HCD01017  猫飛      さん
  5386.      HAD01045  SAINT      さん
  5387.      PGA01332  -なるチャン-☆ さん
  5388.      HAC01216  doubt      さん
  5389.      GDH03105  だいへいくん  さん
  5390.    GBH00541 DORAGON     さん
  5391.    HFB02053 RENCHAN     さん
  5392.    JAG00217 てげてげ    さん
  5393.    HGE00530 し~なくん   さん
  5394.  
  5395.  
  5396. 8.著作権
  5397.   本プログラムはNIFTY-ID:GHH01217 山先(やません)に
  5398.  著作権があるものとします。しかし、その使用、配付は自由に行っていただい
  5399.  てかまいません。(FAPXには、同梱してもらうことにしました)
  5400.  
  5401.  
  5402. 9.何かありましたら。
  5403.  NIFTYのフォーラムFTOWNS1の「MopTermとその仲間たち」
  5404. の会議室に発言されるか、私あてメールを下さい。
  5405.  
  5406.                        GHH01217 山先
  5407. /* DIVIDE_END */
  5408.  
  5409. /* -DIVIDE_START=ct.ggg */
  5410. ======================================================================
  5411. 【ソフト  名】  ct.exe NIFTYコメントツリー作成プログラム     Version 0.05u
  5412. 【登  録  名】  ct005u.lzh (LHAで解凍して下さい)
  5413. 【検索  キー】  1:CT 2:MOPTERM 3:FAPX 4:CATLOG
  5414. 【著作権  者】  山先  GHH01217
  5415. 【開発  環境】  Turbo-C Ver2.0 + Vz →  ct.exe
  5416. 【対応  機種】  MS-DOS 汎用
  5417.         運用推奨:HDD上
  5418. 【動作  確認】  FM-TOWNS20F + 8M-RAM  コンソール上
  5419. 【公  開  日】  93/08/26
  5420. 【ソフトウェア種別】 通信関連。フリー・ソフトウェア。
  5421. ======================================================================
  5422. 【ソフト紹介】
  5423.    本プログラムは、NIFTYのログを参照して、そのコメントツリーを表
  5424.   示する物です。
  5425.  
  5426.  CTが理解できるファイルは、次のファイルです。
  5427.  ┌───────────────────────────┐
  5428.  │・FAPXを使ってオートでダウンした「生ログファイル」│
  5429.  │・CATLOGを使って「整理したファイル」      │
  5430.  └───────────────────────────┘
  5431.    本来は、フォーラムの会議室の発言とPATIOの発言だけを処理すれば
  5432.   良いのですが、追加機能としてそれ以外のデータも処理するようにしていま
  5433.   す。ただし、発言番号の順等に並んだ物として表示されます。
  5434.  
  5435.  解凍すると以下のファイルが出て来ます。
  5436.   ct.exe ……………… プログラム本体
  5437.   ct.doc ……………… CTの説明
  5438.   ct.ggg ……………… このファイル(概要)
  5439.  
  5440.    詳しくはCT.DOCをお読み下さい。
  5441.  
  5442.    ダウンロードファイル名を  ct005u.lzh   として下さい。
  5443.                                               GHH01217  山先
  5444. /* DIVIDE_END */
  5445.  
  5446.